##// END OF EJS Templates
clean Rayleigh funcionando, tiempo de ejecución elevado usando todos los pares
joabAM -
r1391:fba03565a781
parent child
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,693 +1,695
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
2 # All rights reserved.
2 # All rights reserved.
3 #
3 #
4 # Distributed under the terms of the BSD 3-clause license.
4 # Distributed under the terms of the BSD 3-clause license.
5 """Base class to create plot operations
5 """Base class to create plot operations
6
6
7 """
7 """
8
8
9 import os
9 import os
10 import sys
10 import sys
11 import zmq
11 import zmq
12 import time
12 import time
13 import numpy
13 import numpy
14 import datetime
14 import datetime
15 from collections import deque
15 from collections import deque
16 from functools import wraps
16 from functools import wraps
17 from threading import Thread
17 from threading import Thread
18 import matplotlib
18 import matplotlib
19
19
20 if 'BACKEND' in os.environ:
20 if 'BACKEND' in os.environ:
21 matplotlib.use(os.environ['BACKEND'])
21 matplotlib.use(os.environ['BACKEND'])
22 elif 'linux' in sys.platform:
22 elif 'linux' in sys.platform:
23 matplotlib.use("TkAgg")
23 matplotlib.use("TkAgg")
24 elif 'darwin' in sys.platform:
24 elif 'darwin' in sys.platform:
25 matplotlib.use('MacOSX')
25 matplotlib.use('MacOSX')
26 else:
26 else:
27 from schainpy.utils import log
27 from schainpy.utils import log
28 log.warning('Using default Backend="Agg"', 'INFO')
28 log.warning('Using default Backend="Agg"', 'INFO')
29 matplotlib.use('Agg')
29 matplotlib.use('Agg')
30
30
31 import matplotlib.pyplot as plt
31 import matplotlib.pyplot as plt
32 from matplotlib.patches import Polygon
32 from matplotlib.patches import Polygon
33 from mpl_toolkits.axes_grid1 import make_axes_locatable
33 from mpl_toolkits.axes_grid1 import make_axes_locatable
34 from matplotlib.ticker import FuncFormatter, LinearLocator, MultipleLocator
34 from matplotlib.ticker import FuncFormatter, LinearLocator, MultipleLocator
35
35
36 from schainpy.model.data.jrodata import PlotterData
36 from schainpy.model.data.jrodata import PlotterData
37 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
37 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
38 from schainpy.utils import log
38 from schainpy.utils import log
39
39
40 jet_values = matplotlib.pyplot.get_cmap('jet', 100)(numpy.arange(100))[10:90]
40 jet_values = matplotlib.pyplot.get_cmap('jet', 100)(numpy.arange(100))[10:90]
41 blu_values = matplotlib.pyplot.get_cmap(
41 blu_values = matplotlib.pyplot.get_cmap(
42 'seismic_r', 20)(numpy.arange(20))[10:15]
42 'seismic_r', 20)(numpy.arange(20))[10:15]
43 ncmap = matplotlib.colors.LinearSegmentedColormap.from_list(
43 ncmap = matplotlib.colors.LinearSegmentedColormap.from_list(
44 'jro', numpy.vstack((blu_values, jet_values)))
44 'jro', numpy.vstack((blu_values, jet_values)))
45 matplotlib.pyplot.register_cmap(cmap=ncmap)
45 matplotlib.pyplot.register_cmap(cmap=ncmap)
46
46
47 CMAPS = [plt.get_cmap(s) for s in ('jro', 'jet', 'viridis',
47 CMAPS = [plt.get_cmap(s) for s in ('jro', 'jet', 'viridis',
48 'plasma', 'inferno', 'Greys', 'seismic', 'bwr', 'coolwarm')]
48 'plasma', 'inferno', 'Greys', 'seismic', 'bwr', 'coolwarm')]
49
49
50 EARTH_RADIUS = 6.3710e3
50 EARTH_RADIUS = 6.3710e3
51
51
52 def ll2xy(lat1, lon1, lat2, lon2):
52 def ll2xy(lat1, lon1, lat2, lon2):
53
53
54 p = 0.017453292519943295
54 p = 0.017453292519943295
55 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
55 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
56 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
56 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
57 r = 12742 * numpy.arcsin(numpy.sqrt(a))
57 r = 12742 * numpy.arcsin(numpy.sqrt(a))
58 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
58 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
59 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
59 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
60 theta = -theta + numpy.pi/2
60 theta = -theta + numpy.pi/2
61 return r*numpy.cos(theta), r*numpy.sin(theta)
61 return r*numpy.cos(theta), r*numpy.sin(theta)
62
62
63
63
64 def km2deg(km):
64 def km2deg(km):
65 '''
65 '''
66 Convert distance in km to degrees
66 Convert distance in km to degrees
67 '''
67 '''
68
68
69 return numpy.rad2deg(km/EARTH_RADIUS)
69 return numpy.rad2deg(km/EARTH_RADIUS)
70
70
71
71
72 def figpause(interval):
72 def figpause(interval):
73 backend = plt.rcParams['backend']
73 backend = plt.rcParams['backend']
74 if backend in matplotlib.rcsetup.interactive_bk:
74 if backend in matplotlib.rcsetup.interactive_bk:
75 figManager = matplotlib._pylab_helpers.Gcf.get_active()
75 figManager = matplotlib._pylab_helpers.Gcf.get_active()
76 if figManager is not None:
76 if figManager is not None:
77 canvas = figManager.canvas
77 canvas = figManager.canvas
78 if canvas.figure.stale:
78 if canvas.figure.stale:
79 canvas.draw()
79 canvas.draw()
80 try:
80 try:
81 canvas.start_event_loop(interval)
81 canvas.start_event_loop(interval)
82 except:
82 except:
83 pass
83 pass
84 return
84 return
85
85
86 def popup(message):
86 def popup(message):
87 '''
87 '''
88 '''
88 '''
89
89
90 fig = plt.figure(figsize=(12, 8), facecolor='r')
90 fig = plt.figure(figsize=(12, 8), facecolor='r')
91 text = '\n'.join([s.strip() for s in message.split(':')])
91 text = '\n'.join([s.strip() for s in message.split(':')])
92 fig.text(0.01, 0.5, text, ha='left', va='center',
92 fig.text(0.01, 0.5, text, ha='left', va='center',
93 size='20', weight='heavy', color='w')
93 size='20', weight='heavy', color='w')
94 fig.show()
94 fig.show()
95 figpause(1000)
95 figpause(1000)
96
96
97
97
98 class Throttle(object):
98 class Throttle(object):
99 '''
99 '''
100 Decorator that prevents a function from being called more than once every
100 Decorator that prevents a function from being called more than once every
101 time period.
101 time period.
102 To create a function that cannot be called more than once a minute, but
102 To create a function that cannot be called more than once a minute, but
103 will sleep until it can be called:
103 will sleep until it can be called:
104 @Throttle(minutes=1)
104 @Throttle(minutes=1)
105 def foo():
105 def foo():
106 pass
106 pass
107
107
108 for i in range(10):
108 for i in range(10):
109 foo()
109 foo()
110 print "This function has run %s times." % i
110 print "This function has run %s times." % i
111 '''
111 '''
112
112
113 def __init__(self, seconds=0, minutes=0, hours=0):
113 def __init__(self, seconds=0, minutes=0, hours=0):
114 self.throttle_period = datetime.timedelta(
114 self.throttle_period = datetime.timedelta(
115 seconds=seconds, minutes=minutes, hours=hours
115 seconds=seconds, minutes=minutes, hours=hours
116 )
116 )
117
117
118 self.time_of_last_call = datetime.datetime.min
118 self.time_of_last_call = datetime.datetime.min
119
119
120 def __call__(self, fn):
120 def __call__(self, fn):
121 @wraps(fn)
121 @wraps(fn)
122 def wrapper(*args, **kwargs):
122 def wrapper(*args, **kwargs):
123 coerce = kwargs.pop('coerce', None)
123 coerce = kwargs.pop('coerce', None)
124 if coerce:
124 if coerce:
125 self.time_of_last_call = datetime.datetime.now()
125 self.time_of_last_call = datetime.datetime.now()
126 return fn(*args, **kwargs)
126 return fn(*args, **kwargs)
127 else:
127 else:
128 now = datetime.datetime.now()
128 now = datetime.datetime.now()
129 time_since_last_call = now - self.time_of_last_call
129 time_since_last_call = now - self.time_of_last_call
130 time_left = self.throttle_period - time_since_last_call
130 time_left = self.throttle_period - time_since_last_call
131
131
132 if time_left > datetime.timedelta(seconds=0):
132 if time_left > datetime.timedelta(seconds=0):
133 return
133 return
134
134
135 self.time_of_last_call = datetime.datetime.now()
135 self.time_of_last_call = datetime.datetime.now()
136 return fn(*args, **kwargs)
136 return fn(*args, **kwargs)
137
137
138 return wrapper
138 return wrapper
139
139
140 def apply_throttle(value):
140 def apply_throttle(value):
141
141
142 @Throttle(seconds=value)
142 @Throttle(seconds=value)
143 def fnThrottled(fn):
143 def fnThrottled(fn):
144 fn()
144 fn()
145
145
146 return fnThrottled
146 return fnThrottled
147
147
148
148
149 @MPDecorator
149 @MPDecorator
150 class Plot(Operation):
150 class Plot(Operation):
151 """Base class for Schain plotting operations
151 """Base class for Schain plotting operations
152
152
153 This class should never be use directtly you must subclass a new operation,
153 This class should never be use directtly you must subclass a new operation,
154 children classes must be defined as follow:
154 children classes must be defined as follow:
155
155
156 ExamplePlot(Plot):
156 ExamplePlot(Plot):
157
157
158 CODE = 'code'
158 CODE = 'code'
159 colormap = 'jet'
159 colormap = 'jet'
160 plot_type = 'pcolor' # options are ('pcolor', 'pcolorbuffer', 'scatter', 'scatterbuffer')
160 plot_type = 'pcolor' # options are ('pcolor', 'pcolorbuffer', 'scatter', 'scatterbuffer')
161
161
162 def setup(self):
162 def setup(self):
163 pass
163 pass
164
164
165 def plot(self):
165 def plot(self):
166 pass
166 pass
167
167
168 """
168 """
169
169
170 CODE = 'Figure'
170 CODE = 'Figure'
171 colormap = 'jet'
171 colormap = 'jet'
172 bgcolor = 'white'
172 bgcolor = 'white'
173 buffering = True
173 buffering = True
174 __missing = 1E30
174 __missing = 1E30
175
175
176 __attrs__ = ['show', 'save', 'ymin', 'ymax', 'zmin', 'zmax', 'title',
176 __attrs__ = ['show', 'save', 'ymin', 'ymax', 'zmin', 'zmax', 'title',
177 'showprofile']
177 'showprofile']
178
178
179 def __init__(self):
179 def __init__(self):
180
180
181 Operation.__init__(self)
181 Operation.__init__(self)
182 self.isConfig = False
182 self.isConfig = False
183 self.isPlotConfig = False
183 self.isPlotConfig = False
184 self.save_time = 0
184 self.save_time = 0
185 self.sender_time = 0
185 self.sender_time = 0
186 self.data = None
186 self.data = None
187 self.firsttime = True
187 self.firsttime = True
188 self.sender_queue = deque(maxlen=10)
188 self.sender_queue = deque(maxlen=10)
189 self.plots_adjust = {'left': 0.125, 'right': 0.9, 'bottom': 0.15, 'top': 0.9, 'wspace': 0.2, 'hspace': 0.2}
189 self.plots_adjust = {'left': 0.125, 'right': 0.9, 'bottom': 0.15, 'top': 0.9, 'wspace': 0.2, 'hspace': 0.2}
190
190
191 def __fmtTime(self, x, pos):
191 def __fmtTime(self, x, pos):
192 '''
192 '''
193 '''
193 '''
194
194
195 return '{}'.format(self.getDateTime(x).strftime('%H:%M'))
195 return '{}'.format(self.getDateTime(x).strftime('%H:%M'))
196
196
197 def __setup(self, **kwargs):
197 def __setup(self, **kwargs):
198 '''
198 '''
199 Initialize variables
199 Initialize variables
200 '''
200 '''
201
201
202 self.figures = []
202 self.figures = []
203 self.axes = []
203 self.axes = []
204 self.cb_axes = []
204 self.cb_axes = []
205 self.pf_axes = []
205 self.localtime = kwargs.pop('localtime', True)
206 self.localtime = kwargs.pop('localtime', True)
206 self.show = kwargs.get('show', True)
207 self.show = kwargs.get('show', True)
207 self.save = kwargs.get('save', False)
208 self.save = kwargs.get('save', False)
208 self.save_period = kwargs.get('save_period', 0)
209 self.save_period = kwargs.get('save_period', 0)
209 self.colormap = kwargs.get('colormap', self.colormap)
210 self.colormap = kwargs.get('colormap', self.colormap)
210 self.colormap_coh = kwargs.get('colormap_coh', 'jet')
211 self.colormap_coh = kwargs.get('colormap_coh', 'jet')
211 self.colormap_phase = kwargs.get('colormap_phase', 'RdBu_r')
212 self.colormap_phase = kwargs.get('colormap_phase', 'RdBu_r')
212 self.colormaps = kwargs.get('colormaps', None)
213 self.colormaps = kwargs.get('colormaps', None)
213 self.bgcolor = kwargs.get('bgcolor', self.bgcolor)
214 self.bgcolor = kwargs.get('bgcolor', self.bgcolor)
214 self.showprofile = kwargs.get('showprofile', False)
215 self.showprofile = kwargs.get('showprofile', False)
215 self.title = kwargs.get('wintitle', self.CODE.upper())
216 self.title = kwargs.get('wintitle', self.CODE.upper())
216 self.cb_label = kwargs.get('cb_label', None)
217 self.cb_label = kwargs.get('cb_label', None)
217 self.cb_labels = kwargs.get('cb_labels', None)
218 self.cb_labels = kwargs.get('cb_labels', None)
218 self.labels = kwargs.get('labels', None)
219 self.labels = kwargs.get('labels', None)
219 self.xaxis = kwargs.get('xaxis', 'frequency')
220 self.xaxis = kwargs.get('xaxis', 'frequency')
220 self.zmin = kwargs.get('zmin', None)
221 self.zmin = kwargs.get('zmin', None)
221 self.zmax = kwargs.get('zmax', None)
222 self.zmax = kwargs.get('zmax', None)
222 self.zlimits = kwargs.get('zlimits', None)
223 self.zlimits = kwargs.get('zlimits', None)
223 self.xmin = kwargs.get('xmin', None)
224 self.xmin = kwargs.get('xmin', None)
224 self.xmax = kwargs.get('xmax', None)
225 self.xmax = kwargs.get('xmax', None)
225 self.xrange = kwargs.get('xrange', 12)
226 self.xrange = kwargs.get('xrange', 12)
226 self.xscale = kwargs.get('xscale', None)
227 self.xscale = kwargs.get('xscale', None)
227 self.ymin = kwargs.get('ymin', None)
228 self.ymin = kwargs.get('ymin', None)
228 self.ymax = kwargs.get('ymax', None)
229 self.ymax = kwargs.get('ymax', None)
229 self.yscale = kwargs.get('yscale', None)
230 self.yscale = kwargs.get('yscale', None)
230 self.xlabel = kwargs.get('xlabel', None)
231 self.xlabel = kwargs.get('xlabel', None)
231 self.attr_time = kwargs.get('attr_time', 'utctime')
232 self.attr_time = kwargs.get('attr_time', 'utctime')
232 self.attr_data = kwargs.get('attr_data', 'data_param')
233 self.attr_data = kwargs.get('attr_data', 'data_param')
233 self.decimation = kwargs.get('decimation', None)
234 self.decimation = kwargs.get('decimation', None)
234 self.oneFigure = kwargs.get('oneFigure', True)
235 self.oneFigure = kwargs.get('oneFigure', True)
235 self.width = kwargs.get('width', None)
236 self.width = kwargs.get('width', None)
236 self.height = kwargs.get('height', None)
237 self.height = kwargs.get('height', None)
237 self.colorbar = kwargs.get('colorbar', True)
238 self.colorbar = kwargs.get('colorbar', True)
238 self.factors = kwargs.get('factors', [1, 1, 1, 1, 1, 1, 1, 1])
239 self.factors = kwargs.get('factors', [1, 1, 1, 1, 1, 1, 1, 1])
239 self.channels = kwargs.get('channels', None)
240 self.channels = kwargs.get('channels', None)
240 self.titles = kwargs.get('titles', [])
241 self.titles = kwargs.get('titles', [])
241 self.polar = False
242 self.polar = False
242 self.type = kwargs.get('type', 'iq')
243 self.type = kwargs.get('type', 'iq')
243 self.grid = kwargs.get('grid', False)
244 self.grid = kwargs.get('grid', False)
244 self.pause = kwargs.get('pause', False)
245 self.pause = kwargs.get('pause', False)
245 self.save_code = kwargs.get('save_code', self.CODE)
246 self.save_code = kwargs.get('save_code', self.CODE)
246 self.throttle = kwargs.get('throttle', 0)
247 self.throttle = kwargs.get('throttle', 0)
247 self.exp_code = kwargs.get('exp_code', None)
248 self.exp_code = kwargs.get('exp_code', None)
248 self.server = kwargs.get('server', False)
249 self.server = kwargs.get('server', False)
249 self.sender_period = kwargs.get('sender_period', 60)
250 self.sender_period = kwargs.get('sender_period', 60)
250 self.tag = kwargs.get('tag', '')
251 self.tag = kwargs.get('tag', '')
251 self.height_index = kwargs.get('height_index', None)
252 self.height_index = kwargs.get('height_index', None)
252 self.__throttle_plot = apply_throttle(self.throttle)
253 self.__throttle_plot = apply_throttle(self.throttle)
253 code = self.attr_data if self.attr_data else self.CODE
254 code = self.attr_data if self.attr_data else self.CODE
254 self.data = PlotterData(self.CODE, self.exp_code, self.localtime)
255 self.data = PlotterData(self.CODE, self.exp_code, self.localtime)
256 self.tmin = kwargs.get('tmin', None)
255
257
256 if self.server:
258 if self.server:
257 if not self.server.startswith('tcp://'):
259 if not self.server.startswith('tcp://'):
258 self.server = 'tcp://{}'.format(self.server)
260 self.server = 'tcp://{}'.format(self.server)
259 log.success(
261 log.success(
260 'Sending to server: {}'.format(self.server),
262 'Sending to server: {}'.format(self.server),
261 self.name
263 self.name
262 )
264 )
263
265
264 if isinstance(self.attr_data, str):
266 if isinstance(self.attr_data, str):
265 self.attr_data = [self.attr_data]
267 self.attr_data = [self.attr_data]
266
268
267 def __setup_plot(self):
269 def __setup_plot(self):
268 '''
270 '''
269 Common setup for all figures, here figures and axes are created
271 Common setup for all figures, here figures and axes are created
270 '''
272 '''
271
273
272 self.setup()
274 self.setup()
273
275
274 self.time_label = 'LT' if self.localtime else 'UTC'
276 self.time_label = 'LT' if self.localtime else 'UTC'
275
277
276 if self.width is None:
278 if self.width is None:
277 self.width = 8
279 self.width = 8
278
280
279 self.figures = []
281 self.figures = []
280 self.axes = []
282 self.axes = []
281 self.cb_axes = []
283 self.cb_axes = []
282 self.pf_axes = []
284 self.pf_axes = []
283 self.cmaps = []
285 self.cmaps = []
284
286
285 size = '15%' if self.ncols == 1 else '30%'
287 size = '15%' if self.ncols == 1 else '30%'
286 pad = '4%' if self.ncols == 1 else '8%'
288 pad = '4%' if self.ncols == 1 else '8%'
287
289
288 if self.oneFigure:
290 if self.oneFigure:
289 if self.height is None:
291 if self.height is None:
290 self.height = 1.4 * self.nrows + 1
292 self.height = 1.4 * self.nrows + 1
291 fig = plt.figure(figsize=(self.width, self.height),
293 fig = plt.figure(figsize=(self.width, self.height),
292 edgecolor='k',
294 edgecolor='k',
293 facecolor='w')
295 facecolor='w')
294 self.figures.append(fig)
296 self.figures.append(fig)
295 for n in range(self.nplots):
297 for n in range(self.nplots):
296 ax = fig.add_subplot(self.nrows, self.ncols,
298 ax = fig.add_subplot(self.nrows, self.ncols,
297 n + 1, polar=self.polar)
299 n + 1, polar=self.polar)
298 ax.tick_params(labelsize=8)
300 ax.tick_params(labelsize=8)
299 ax.firsttime = True
301 ax.firsttime = True
300 ax.index = 0
302 ax.index = 0
301 ax.press = None
303 ax.press = None
302 self.axes.append(ax)
304 self.axes.append(ax)
303 if self.showprofile:
305 if self.showprofile:
304 cax = self.__add_axes(ax, size=size, pad=pad)
306 cax = self.__add_axes(ax, size=size, pad=pad)
305 cax.tick_params(labelsize=8)
307 cax.tick_params(labelsize=8)
306 self.pf_axes.append(cax)
308 self.pf_axes.append(cax)
307 else:
309 else:
308 if self.height is None:
310 if self.height is None:
309 self.height = 3
311 self.height = 3
310 for n in range(self.nplots):
312 for n in range(self.nplots):
311 fig = plt.figure(figsize=(self.width, self.height),
313 fig = plt.figure(figsize=(self.width, self.height),
312 edgecolor='k',
314 edgecolor='k',
313 facecolor='w')
315 facecolor='w')
314 ax = fig.add_subplot(1, 1, 1, polar=self.polar)
316 ax = fig.add_subplot(1, 1, 1, polar=self.polar)
315 ax.tick_params(labelsize=8)
317 ax.tick_params(labelsize=8)
316 ax.firsttime = True
318 ax.firsttime = True
317 ax.index = 0
319 ax.index = 0
318 ax.press = None
320 ax.press = None
319 self.figures.append(fig)
321 self.figures.append(fig)
320 self.axes.append(ax)
322 self.axes.append(ax)
321 if self.showprofile:
323 if self.showprofile:
322 cax = self.__add_axes(ax, size=size, pad=pad)
324 cax = self.__add_axes(ax, size=size, pad=pad)
323 cax.tick_params(labelsize=8)
325 cax.tick_params(labelsize=8)
324 self.pf_axes.append(cax)
326 self.pf_axes.append(cax)
325
327
326 for n in range(self.nrows):
328 for n in range(self.nrows):
327 if self.colormaps is not None:
329 if self.colormaps is not None:
328 cmap = plt.get_cmap(self.colormaps[n])
330 cmap = plt.get_cmap(self.colormaps[n])
329 else:
331 else:
330 cmap = plt.get_cmap(self.colormap)
332 cmap = plt.get_cmap(self.colormap)
331 cmap.set_bad(self.bgcolor, 1.)
333 cmap.set_bad(self.bgcolor, 1.)
332 self.cmaps.append(cmap)
334 self.cmaps.append(cmap)
333
335
334 def __add_axes(self, ax, size='30%', pad='8%'):
336 def __add_axes(self, ax, size='30%', pad='8%'):
335 '''
337 '''
336 Add new axes to the given figure
338 Add new axes to the given figure
337 '''
339 '''
338 divider = make_axes_locatable(ax)
340 divider = make_axes_locatable(ax)
339 nax = divider.new_horizontal(size=size, pad=pad)
341 nax = divider.new_horizontal(size=size, pad=pad)
340 ax.figure.add_axes(nax)
342 ax.figure.add_axes(nax)
341 return nax
343 return nax
342
344
343 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
345 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
344 '''
346 '''
345 Create a masked array for missing data
347 Create a masked array for missing data
346 '''
348 '''
347 if x_buffer.shape[0] < 2:
349 if x_buffer.shape[0] < 2:
348 return x_buffer, y_buffer, z_buffer
350 return x_buffer, y_buffer, z_buffer
349
351
350 deltas = x_buffer[1:] - x_buffer[0:-1]
352 deltas = x_buffer[1:] - x_buffer[0:-1]
351 x_median = numpy.median(deltas)
353 x_median = numpy.median(deltas)
352
354
353 index = numpy.where(deltas > 5 * x_median)
355 index = numpy.where(deltas > 5 * x_median)
354
356
355 if len(index[0]) != 0:
357 if len(index[0]) != 0:
356 z_buffer[::, index[0], ::] = self.__missing
358 z_buffer[::, index[0], ::] = self.__missing
357 z_buffer = numpy.ma.masked_inside(z_buffer,
359 z_buffer = numpy.ma.masked_inside(z_buffer,
358 0.99 * self.__missing,
360 0.99 * self.__missing,
359 1.01 * self.__missing)
361 1.01 * self.__missing)
360
362
361 return x_buffer, y_buffer, z_buffer
363 return x_buffer, y_buffer, z_buffer
362
364
363 def decimate(self):
365 def decimate(self):
364
366
365 # dx = int(len(self.x)/self.__MAXNUMX) + 1
367 # dx = int(len(self.x)/self.__MAXNUMX) + 1
366 dy = int(len(self.y) / self.decimation) + 1
368 dy = int(len(self.y) / self.decimation) + 1
367
369
368 # x = self.x[::dx]
370 # x = self.x[::dx]
369 x = self.x
371 x = self.x
370 y = self.y[::dy]
372 y = self.y[::dy]
371 z = self.z[::, ::, ::dy]
373 z = self.z[::, ::, ::dy]
372
374
373 return x, y, z
375 return x, y, z
374
376
375 def format(self):
377 def format(self):
376 '''
378 '''
377 Set min and max values, labels, ticks and titles
379 Set min and max values, labels, ticks and titles
378 '''
380 '''
379
381
380 for n, ax in enumerate(self.axes):
382 for n, ax in enumerate(self.axes):
381 if ax.firsttime:
383 if ax.firsttime:
382 if self.xaxis != 'time':
384 if self.xaxis != 'time':
383 xmin = self.xmin
385 xmin = self.xmin
384 xmax = self.xmax
386 xmax = self.xmax
385 else:
387 else:
386 xmin = self.tmin
388 xmin = self.tmin
387 xmax = self.tmin + self.xrange*60*60
389 xmax = self.tmin + self.xrange*60*60
388 ax.xaxis.set_major_formatter(FuncFormatter(self.__fmtTime))
390 ax.xaxis.set_major_formatter(FuncFormatter(self.__fmtTime))
389 ax.xaxis.set_major_locator(LinearLocator(9))
391 ax.xaxis.set_major_locator(LinearLocator(9))
390 ymin = self.ymin if self.ymin is not None else numpy.nanmin(self.y[numpy.isfinite(self.y)])
392 ymin = self.ymin if self.ymin is not None else numpy.nanmin(self.y[numpy.isfinite(self.y)])
391 ymax = self.ymax if self.ymax is not None else numpy.nanmax(self.y[numpy.isfinite(self.y)])
393 ymax = self.ymax if self.ymax is not None else numpy.nanmax(self.y[numpy.isfinite(self.y)])
392 ax.set_facecolor(self.bgcolor)
394 ax.set_facecolor(self.bgcolor)
393 if self.xscale:
395 if self.xscale:
394 ax.xaxis.set_major_formatter(FuncFormatter(
396 ax.xaxis.set_major_formatter(FuncFormatter(
395 lambda x, pos: '{0:g}'.format(x*self.xscale)))
397 lambda x, pos: '{0:g}'.format(x*self.xscale)))
396 if self.yscale:
398 if self.yscale:
397 ax.yaxis.set_major_formatter(FuncFormatter(
399 ax.yaxis.set_major_formatter(FuncFormatter(
398 lambda x, pos: '{0:g}'.format(x*self.yscale)))
400 lambda x, pos: '{0:g}'.format(x*self.yscale)))
399 if self.xlabel is not None:
401 if self.xlabel is not None:
400 ax.set_xlabel(self.xlabel)
402 ax.set_xlabel(self.xlabel)
401 if self.ylabel is not None:
403 if self.ylabel is not None:
402 ax.set_ylabel(self.ylabel)
404 ax.set_ylabel(self.ylabel)
403 if self.showprofile:
405 if self.showprofile:
404 self.pf_axes[n].set_ylim(ymin, ymax)
406 self.pf_axes[n].set_ylim(ymin, ymax)
405 self.pf_axes[n].set_xlim(self.zmin, self.zmax)
407 self.pf_axes[n].set_xlim(self.zmin, self.zmax)
406 self.pf_axes[n].set_xlabel('dB')
408 self.pf_axes[n].set_xlabel('dB')
407 self.pf_axes[n].grid(b=True, axis='x')
409 self.pf_axes[n].grid(b=True, axis='x')
408 [tick.set_visible(False)
410 [tick.set_visible(False)
409 for tick in self.pf_axes[n].get_yticklabels()]
411 for tick in self.pf_axes[n].get_yticklabels()]
410 if self.colorbar:
412 if self.colorbar:
411 ax.cbar = plt.colorbar(
413 ax.cbar = plt.colorbar(
412 ax.plt, ax=ax, fraction=0.05, pad=0.02, aspect=10)
414 ax.plt, ax=ax, fraction=0.05, pad=0.02, aspect=10)
413 ax.cbar.ax.tick_params(labelsize=8)
415 ax.cbar.ax.tick_params(labelsize=8)
414 ax.cbar.ax.press = None
416 ax.cbar.ax.press = None
415 if self.cb_label:
417 if self.cb_label:
416 ax.cbar.set_label(self.cb_label, size=8)
418 ax.cbar.set_label(self.cb_label, size=8)
417 elif self.cb_labels:
419 elif self.cb_labels:
418 ax.cbar.set_label(self.cb_labels[n], size=8)
420 ax.cbar.set_label(self.cb_labels[n], size=8)
419 else:
421 else:
420 ax.cbar = None
422 ax.cbar = None
421 ax.set_xlim(xmin, xmax)
423 ax.set_xlim(xmin, xmax)
422 ax.set_ylim(ymin, ymax)
424 ax.set_ylim(ymin, ymax)
423 ax.firsttime = False
425 ax.firsttime = False
424 if self.grid:
426 if self.grid:
425 ax.grid(True)
427 ax.grid(True)
426 if not self.polar:
428 if not self.polar:
427 ax.set_title('{} {} {}'.format(
429 ax.set_title('{} {} {}'.format(
428 self.titles[n],
430 self.titles[n],
429 self.getDateTime(self.data.max_time).strftime(
431 self.getDateTime(self.data.max_time).strftime(
430 '%Y-%m-%d %H:%M:%S'),
432 '%Y-%m-%d %H:%M:%S'),
431 self.time_label),
433 self.time_label),
432 size=8)
434 size=8)
433 else:
435 else:
434 ax.set_title('{}'.format(self.titles[n]), size=8)
436 ax.set_title('{}'.format(self.titles[n]), size=8)
435 ax.set_ylim(0, 90)
437 ax.set_ylim(0, 90)
436 ax.set_yticks(numpy.arange(0, 90, 20))
438 ax.set_yticks(numpy.arange(0, 90, 20))
437 ax.yaxis.labelpad = 40
439 ax.yaxis.labelpad = 40
438
440
439 if self.firsttime:
441 if self.firsttime:
440 for n, fig in enumerate(self.figures):
442 for n, fig in enumerate(self.figures):
441 fig.subplots_adjust(**self.plots_adjust)
443 fig.subplots_adjust(**self.plots_adjust)
442 self.firsttime = False
444 self.firsttime = False
443
445
444 def clear_figures(self):
446 def clear_figures(self):
445 '''
447 '''
446 Reset axes for redraw plots
448 Reset axes for redraw plots
447 '''
449 '''
448
450
449 for ax in self.axes+self.pf_axes+self.cb_axes:
451 for ax in self.axes+self.pf_axes+self.cb_axes:
450 ax.clear()
452 ax.clear()
451 ax.firsttime = True
453 ax.firsttime = True
452 if hasattr(ax, 'cbar') and ax.cbar:
454 if hasattr(ax, 'cbar') and ax.cbar:
453 ax.cbar.remove()
455 ax.cbar.remove()
454
456
455 def __plot(self):
457 def __plot(self):
456 '''
458 '''
457 Main function to plot, format and save figures
459 Main function to plot, format and save figures
458 '''
460 '''
459
461
460 self.plot()
462 self.plot()
461 self.format()
463 self.format()
462
464
463 for n, fig in enumerate(self.figures):
465 for n, fig in enumerate(self.figures):
464 if self.nrows == 0 or self.nplots == 0:
466 if self.nrows == 0 or self.nplots == 0:
465 log.warning('No data', self.name)
467 log.warning('No data', self.name)
466 fig.text(0.5, 0.5, 'No Data', fontsize='large', ha='center')
468 fig.text(0.5, 0.5, 'No Data', fontsize='large', ha='center')
467 fig.canvas.manager.set_window_title(self.CODE)
469 fig.canvas.manager.set_window_title(self.CODE)
468 continue
470 continue
469
471
470 fig.canvas.manager.set_window_title('{} - {}'.format(self.title,
472 fig.canvas.manager.set_window_title('{} - {}'.format(self.title,
471 self.getDateTime(self.data.max_time).strftime('%Y/%m/%d')))
473 self.getDateTime(self.data.max_time).strftime('%Y/%m/%d')))
472 fig.canvas.draw()
474 fig.canvas.draw()
473 if self.show:
475 if self.show:
474 fig.show()
476 fig.show()
475 figpause(0.01)
477 figpause(0.01)
476
478
477 if self.save:
479 if self.save:
478 self.save_figure(n)
480 self.save_figure(n)
479
481
480 if self.server:
482 if self.server:
481 self.send_to_server()
483 self.send_to_server()
482
484
483 def __update(self, dataOut, timestamp):
485 def __update(self, dataOut, timestamp):
484 '''
486 '''
485 '''
487 '''
486
488
487 metadata = {
489 metadata = {
488 'yrange': dataOut.heightList,
490 'yrange': dataOut.heightList,
489 'interval': dataOut.timeInterval,
491 'interval': dataOut.timeInterval,
490 'channels': dataOut.channelList
492 'channels': dataOut.channelList
491 }
493 }
492
494
493 data, meta = self.update(dataOut)
495 data, meta = self.update(dataOut)
494 metadata.update(meta)
496 metadata.update(meta)
495 self.data.update(data, timestamp, metadata)
497 self.data.update(data, timestamp, metadata)
496
498
497 def save_figure(self, n):
499 def save_figure(self, n):
498 '''
500 '''
499 '''
501 '''
500
502
501 if (self.data.max_time - self.save_time) <= self.save_period:
503 if (self.data.max_time - self.save_time) <= self.save_period:
502 return
504 return
503
505
504 self.save_time = self.data.max_time
506 self.save_time = self.data.max_time
505
507
506 fig = self.figures[n]
508 fig = self.figures[n]
507
509
508 if self.throttle == 0:
510 if self.throttle == 0:
509 figname = os.path.join(
511 figname = os.path.join(
510 self.save,
512 self.save,
511 self.save_code,
513 self.save_code,
512 '{}_{}.png'.format(
514 '{}_{}.png'.format(
513 self.save_code,
515 self.save_code,
514 self.getDateTime(self.data.max_time).strftime(
516 self.getDateTime(self.data.max_time).strftime(
515 '%Y%m%d_%H%M%S'
517 '%Y%m%d_%H%M%S'
516 ),
518 ),
517 )
519 )
518 )
520 )
519 log.log('Saving figure: {}'.format(figname), self.name)
521 log.log('Saving figure: {}'.format(figname), self.name)
520 if not os.path.isdir(os.path.dirname(figname)):
522 if not os.path.isdir(os.path.dirname(figname)):
521 os.makedirs(os.path.dirname(figname))
523 os.makedirs(os.path.dirname(figname))
522 fig.savefig(figname)
524 fig.savefig(figname)
523
525
524 figname = os.path.join(
526 figname = os.path.join(
525 self.save,
527 self.save,
526 '{}_{}.png'.format(
528 '{}_{}.png'.format(
527 self.save_code,
529 self.save_code,
528 self.getDateTime(self.data.min_time).strftime(
530 self.getDateTime(self.data.min_time).strftime(
529 '%Y%m%d'
531 '%Y%m%d'
530 ),
532 ),
531 )
533 )
532 )
534 )
533
535
534 log.log('Saving figure: {}'.format(figname), self.name)
536 log.log('Saving figure: {}'.format(figname), self.name)
535 if not os.path.isdir(os.path.dirname(figname)):
537 if not os.path.isdir(os.path.dirname(figname)):
536 os.makedirs(os.path.dirname(figname))
538 os.makedirs(os.path.dirname(figname))
537 fig.savefig(figname)
539 fig.savefig(figname)
538
540
539 def send_to_server(self):
541 def send_to_server(self):
540 '''
542 '''
541 '''
543 '''
542
544
543 if self.exp_code == None:
545 if self.exp_code == None:
544 log.warning('Missing `exp_code` skipping sending to server...')
546 log.warning('Missing `exp_code` skipping sending to server...')
545
547
546 last_time = self.data.max_time
548 last_time = self.data.max_time
547 interval = last_time - self.sender_time
549 interval = last_time - self.sender_time
548 if interval < self.sender_period:
550 if interval < self.sender_period:
549 return
551 return
550
552
551 self.sender_time = last_time
553 self.sender_time = last_time
552
554
553 attrs = ['titles', 'zmin', 'zmax', 'tag', 'ymin', 'ymax']
555 attrs = ['titles', 'zmin', 'zmax', 'tag', 'ymin', 'ymax']
554 for attr in attrs:
556 for attr in attrs:
555 value = getattr(self, attr)
557 value = getattr(self, attr)
556 if value:
558 if value:
557 if isinstance(value, (numpy.float32, numpy.float64)):
559 if isinstance(value, (numpy.float32, numpy.float64)):
558 value = round(float(value), 2)
560 value = round(float(value), 2)
559 self.data.meta[attr] = value
561 self.data.meta[attr] = value
560 if self.colormap == 'jet':
562 if self.colormap == 'jet':
561 self.data.meta['colormap'] = 'Jet'
563 self.data.meta['colormap'] = 'Jet'
562 elif 'RdBu' in self.colormap:
564 elif 'RdBu' in self.colormap:
563 self.data.meta['colormap'] = 'RdBu'
565 self.data.meta['colormap'] = 'RdBu'
564 else:
566 else:
565 self.data.meta['colormap'] = 'Viridis'
567 self.data.meta['colormap'] = 'Viridis'
566 self.data.meta['interval'] = int(interval)
568 self.data.meta['interval'] = int(interval)
567
569
568 self.sender_queue.append(last_time)
570 self.sender_queue.append(last_time)
569
571
570 while True:
572 while True:
571 try:
573 try:
572 tm = self.sender_queue.popleft()
574 tm = self.sender_queue.popleft()
573 except IndexError:
575 except IndexError:
574 break
576 break
575 msg = self.data.jsonify(tm, self.save_code, self.plot_type)
577 msg = self.data.jsonify(tm, self.save_code, self.plot_type)
576 self.socket.send_string(msg)
578 self.socket.send_string(msg)
577 socks = dict(self.poll.poll(2000))
579 socks = dict(self.poll.poll(2000))
578 if socks.get(self.socket) == zmq.POLLIN:
580 if socks.get(self.socket) == zmq.POLLIN:
579 reply = self.socket.recv_string()
581 reply = self.socket.recv_string()
580 if reply == 'ok':
582 if reply == 'ok':
581 log.log("Response from server ok", self.name)
583 log.log("Response from server ok", self.name)
582 time.sleep(0.1)
584 time.sleep(0.1)
583 continue
585 continue
584 else:
586 else:
585 log.warning(
587 log.warning(
586 "Malformed reply from server: {}".format(reply), self.name)
588 "Malformed reply from server: {}".format(reply), self.name)
587 else:
589 else:
588 log.warning(
590 log.warning(
589 "No response from server, retrying...", self.name)
591 "No response from server, retrying...", self.name)
590 self.sender_queue.appendleft(tm)
592 self.sender_queue.appendleft(tm)
591 self.socket.setsockopt(zmq.LINGER, 0)
593 self.socket.setsockopt(zmq.LINGER, 0)
592 self.socket.close()
594 self.socket.close()
593 self.poll.unregister(self.socket)
595 self.poll.unregister(self.socket)
594 self.socket = self.context.socket(zmq.REQ)
596 self.socket = self.context.socket(zmq.REQ)
595 self.socket.connect(self.server)
597 self.socket.connect(self.server)
596 self.poll.register(self.socket, zmq.POLLIN)
598 self.poll.register(self.socket, zmq.POLLIN)
597 break
599 break
598
600
599 def setup(self):
601 def setup(self):
600 '''
602 '''
601 This method should be implemented in the child class, the following
603 This method should be implemented in the child class, the following
602 attributes should be set:
604 attributes should be set:
603
605
604 self.nrows: number of rows
606 self.nrows: number of rows
605 self.ncols: number of cols
607 self.ncols: number of cols
606 self.nplots: number of plots (channels or pairs)
608 self.nplots: number of plots (channels or pairs)
607 self.ylabel: label for Y axes
609 self.ylabel: label for Y axes
608 self.titles: list of axes title
610 self.titles: list of axes title
609
611
610 '''
612 '''
611 raise NotImplementedError
613 raise NotImplementedError
612
614
613 def plot(self):
615 def plot(self):
614 '''
616 '''
615 Must be defined in the child class, the actual plotting method
617 Must be defined in the child class, the actual plotting method
616 '''
618 '''
617 raise NotImplementedError
619 raise NotImplementedError
618
620
619 def update(self, dataOut):
621 def update(self, dataOut):
620 '''
622 '''
621 Must be defined in the child class, update self.data with new data
623 Must be defined in the child class, update self.data with new data
622 '''
624 '''
623
625
624 data = {
626 data = {
625 self.CODE: getattr(dataOut, 'data_{}'.format(self.CODE))
627 self.CODE: getattr(dataOut, 'data_{}'.format(self.CODE))
626 }
628 }
627 meta = {}
629 meta = {}
628
630
629 return data, meta
631 return data, meta
630
632
631 def run(self, dataOut, **kwargs):
633 def run(self, dataOut, **kwargs):
632 '''
634 '''
633 Main plotting routine
635 Main plotting routine
634 '''
636 '''
635
637
636 if self.isConfig is False:
638 if self.isConfig is False:
637 self.__setup(**kwargs)
639 self.__setup(**kwargs)
638
640
639 if self.localtime:
641 if self.localtime:
640 self.getDateTime = datetime.datetime.fromtimestamp
642 self.getDateTime = datetime.datetime.fromtimestamp
641 else:
643 else:
642 self.getDateTime = datetime.datetime.utcfromtimestamp
644 self.getDateTime = datetime.datetime.utcfromtimestamp
643
645
644 self.data.setup()
646 self.data.setup()
645 self.isConfig = True
647 self.isConfig = True
646 if self.server:
648 if self.server:
647 self.context = zmq.Context()
649 self.context = zmq.Context()
648 self.socket = self.context.socket(zmq.REQ)
650 self.socket = self.context.socket(zmq.REQ)
649 self.socket.connect(self.server)
651 self.socket.connect(self.server)
650 self.poll = zmq.Poller()
652 self.poll = zmq.Poller()
651 self.poll.register(self.socket, zmq.POLLIN)
653 self.poll.register(self.socket, zmq.POLLIN)
652
654
653 tm = getattr(dataOut, self.attr_time)
655 tm = getattr(dataOut, self.attr_time)
654
656
655 if self.data and 'time' in self.xaxis and (tm - self.tmin) >= self.xrange*60*60:
657 if self.data and 'time' in self.xaxis and (tm - self.tmin) >= self.xrange*60*60:
656 self.save_time = tm
658 self.save_time = tm
657 self.__plot()
659 self.__plot()
658 self.tmin += self.xrange*60*60
660 self.tmin += self.xrange*60*60
659 self.data.setup()
661 self.data.setup()
660 self.clear_figures()
662 self.clear_figures()
661
663
662 self.__update(dataOut, tm)
664 self.__update(dataOut, tm)
663
665
664 if self.isPlotConfig is False:
666 if self.isPlotConfig is False:
665 self.__setup_plot()
667 self.__setup_plot()
666 self.isPlotConfig = True
668 self.isPlotConfig = True
667 if self.xaxis == 'time':
669 if self.xaxis == 'time':
668 dt = self.getDateTime(tm)
670 dt = self.getDateTime(tm)
669 if self.xmin is None:
671 if self.xmin is None:
670 self.tmin = tm
672 self.tmin = tm
671 self.xmin = dt.hour
673 self.xmin = dt.hour
672 minutes = (self.xmin-int(self.xmin)) * 60
674 minutes = (self.xmin-int(self.xmin)) * 60
673 seconds = (minutes - int(minutes)) * 60
675 seconds = (minutes - int(minutes)) * 60
674 self.tmin = (dt.replace(hour=int(self.xmin), minute=int(minutes), second=int(seconds)) -
676 self.tmin = (dt.replace(hour=int(self.xmin), minute=int(minutes), second=int(seconds)) -
675 datetime.datetime(1970, 1, 1)).total_seconds()
677 datetime.datetime(1970, 1, 1)).total_seconds()
676 if self.localtime:
678 if self.localtime:
677 self.tmin += time.timezone
679 self.tmin += time.timezone
678
680
679 if self.xmin is not None and self.xmax is not None:
681 if self.xmin is not None and self.xmax is not None:
680 self.xrange = self.xmax - self.xmin
682 self.xrange = self.xmax - self.xmin
681
683
682 if self.throttle == 0:
684 if self.throttle == 0:
683 self.__plot()
685 self.__plot()
684 else:
686 else:
685 self.__throttle_plot(self.__plot)#, coerce=coerce)
687 self.__throttle_plot(self.__plot)#, coerce=coerce)
686
688
687 def close(self):
689 def close(self):
688
690
689 if self.data and not self.data.flagNoData:
691 if self.data and not self.data.flagNoData:
690 self.save_time = 0
692 self.save_time = 0
691 self.__plot()
693 self.__plot()
692 if self.data and not self.data.flagNoData and self.pause:
694 if self.data and not self.data.flagNoData and self.pause:
693 figpause(10)
695 figpause(10)
@@ -1,357 +1,356
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
6 from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot
7 from schainpy.utils import log
7 from schainpy.utils import log
8
8
9 EARTH_RADIUS = 6.3710e3
9 EARTH_RADIUS = 6.3710e3
10
10
11
11
12 def ll2xy(lat1, lon1, lat2, lon2):
12 def ll2xy(lat1, lon1, lat2, lon2):
13
13
14 p = 0.017453292519943295
14 p = 0.017453292519943295
15 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
15 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
16 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
16 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
17 r = 12742 * numpy.arcsin(numpy.sqrt(a))
17 r = 12742 * numpy.arcsin(numpy.sqrt(a))
18 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
18 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
19 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
19 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
20 theta = -theta + numpy.pi/2
20 theta = -theta + numpy.pi/2
21 return r*numpy.cos(theta), r*numpy.sin(theta)
21 return r*numpy.cos(theta), r*numpy.sin(theta)
22
22
23
23
24 def km2deg(km):
24 def km2deg(km):
25 '''
25 '''
26 Convert distance in km to degrees
26 Convert distance in km to degrees
27 '''
27 '''
28
28
29 return numpy.rad2deg(km/EARTH_RADIUS)
29 return numpy.rad2deg(km/EARTH_RADIUS)
30
30
31
31
32
32
33 class SpectralMomentsPlot(SpectraPlot):
33 class SpectralMomentsPlot(SpectraPlot):
34 '''
34 '''
35 Plot for Spectral Moments
35 Plot for Spectral Moments
36 '''
36 '''
37 CODE = 'spc_moments'
37 CODE = 'spc_moments'
38 colormap = 'jet'
38 colormap = 'jet'
39 plot_type = 'pcolor'
39 plot_type = 'pcolor'
40
40
41
41
42 class SnrPlot(RTIPlot):
42 class SnrPlot(RTIPlot):
43 '''
43 '''
44 Plot for SNR Data
44 Plot for SNR Data
45 '''
45 '''
46
46
47 CODE = 'snr'
47 CODE = 'snr'
48 colormap = 'jet'
48 colormap = 'jet'
49
49
50 def update(self, dataOut):
50 def update(self, dataOut):
51
51
52 data = {
52 data = {
53 'snr': 10*numpy.log10(dataOut.data_snr)
53 'snr': 10*numpy.log10(dataOut.data_snr)
54 }
54 }
55
55
56 return data, {}
56 return data, {}
57
57
58 class DopplerPlot(RTIPlot):
58 class DopplerPlot(RTIPlot):
59 '''
59 '''
60 Plot for DOPPLER Data (1st moment)
60 Plot for DOPPLER Data (1st moment)
61 '''
61 '''
62
62
63 CODE = 'dop'
63 CODE = 'dop'
64 colormap = 'jet'
64 colormap = 'jet'
65
65
66 def update(self, dataOut):
66 def update(self, dataOut):
67
67
68 data = {
68 data = {
69 'dop': 10*numpy.log10(dataOut.data_dop)
69 'dop': 10*numpy.log10(dataOut.data_dop)
70 }
70 }
71
71
72 return data, {}
72 return data, {}
73
73
74 class PowerPlot(RTIPlot):
74 class PowerPlot(RTIPlot):
75 '''
75 '''
76 Plot for Power Data (0 moment)
76 Plot for Power Data (0 moment)
77 '''
77 '''
78
78
79 CODE = 'pow'
79 CODE = 'pow'
80 colormap = 'jet'
80 colormap = 'jet'
81
81
82 def update(self, dataOut):
82 def update(self, dataOut):
83
83
84 data = {
84 data = {
85 'pow': 10*numpy.log10(dataOut.data_pow)
85 'pow': 10*numpy.log10(dataOut.data_pow)
86 }
86 }
87
87 print("data",data)
88 return data, {}
88 return data, {}
89
89
90 class SpectralWidthPlot(RTIPlot):
90 class SpectralWidthPlot(RTIPlot):
91 '''
91 '''
92 Plot for Spectral Width Data (2nd moment)
92 Plot for Spectral Width Data (2nd moment)
93 '''
93 '''
94
94
95 CODE = 'width'
95 CODE = 'width'
96 colormap = 'jet'
96 colormap = 'jet'
97
97
98 def update(self, dataOut):
98 def update(self, dataOut):
99
99
100 data = {
100 data = {
101 'width': dataOut.data_width
101 'width': dataOut.data_width
102 }
102 }
103
103
104 return data, {}
104 return data, {}
105
105
106 class SkyMapPlot(Plot):
106 class SkyMapPlot(Plot):
107 '''
107 '''
108 Plot for meteors detection data
108 Plot for meteors detection data
109 '''
109 '''
110
110
111 CODE = 'param'
111 CODE = 'param'
112
112
113 def setup(self):
113 def setup(self):
114
114
115 self.ncols = 1
115 self.ncols = 1
116 self.nrows = 1
116 self.nrows = 1
117 self.width = 7.2
117 self.width = 7.2
118 self.height = 7.2
118 self.height = 7.2
119 self.nplots = 1
119 self.nplots = 1
120 self.xlabel = 'Zonal Zenith Angle (deg)'
120 self.xlabel = 'Zonal Zenith Angle (deg)'
121 self.ylabel = 'Meridional Zenith Angle (deg)'
121 self.ylabel = 'Meridional Zenith Angle (deg)'
122 self.polar = True
122 self.polar = True
123 self.ymin = -180
123 self.ymin = -180
124 self.ymax = 180
124 self.ymax = 180
125 self.colorbar = False
125 self.colorbar = False
126
126
127 def plot(self):
127 def plot(self):
128
128
129 arrayParameters = numpy.concatenate(self.data['param'])
129 arrayParameters = numpy.concatenate(self.data['param'])
130 error = arrayParameters[:, -1]
130 error = arrayParameters[:, -1]
131 indValid = numpy.where(error == 0)[0]
131 indValid = numpy.where(error == 0)[0]
132 finalMeteor = arrayParameters[indValid, :]
132 finalMeteor = arrayParameters[indValid, :]
133 finalAzimuth = finalMeteor[:, 3]
133 finalAzimuth = finalMeteor[:, 3]
134 finalZenith = finalMeteor[:, 4]
134 finalZenith = finalMeteor[:, 4]
135
135
136 x = finalAzimuth * numpy.pi / 180
136 x = finalAzimuth * numpy.pi / 180
137 y = finalZenith
137 y = finalZenith
138
138
139 ax = self.axes[0]
139 ax = self.axes[0]
140
140
141 if ax.firsttime:
141 if ax.firsttime:
142 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
142 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
143 else:
143 else:
144 ax.plot.set_data(x, y)
144 ax.plot.set_data(x, y)
145
145
146 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
146 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
147 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
147 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
148 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
148 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
149 dt2,
149 dt2,
150 len(x))
150 len(x))
151 self.titles[0] = title
151 self.titles[0] = title
152
152
153
153
154 class GenericRTIPlot(Plot):
154 class GenericRTIPlot(Plot):
155 '''
155 '''
156 Plot for data_xxxx object
156 Plot for data_xxxx object
157 '''
157 '''
158
158
159 CODE = 'param'
159 CODE = 'param'
160 colormap = 'viridis'
160 colormap = 'viridis'
161 plot_type = 'pcolorbuffer'
161 plot_type = 'pcolorbuffer'
162
162
163 def setup(self):
163 def setup(self):
164 self.xaxis = 'time'
164 self.xaxis = 'time'
165 self.ncols = 1
165 self.ncols = 1
166 self.nrows = self.data.shape('param')[0]
166 self.nrows = self.data.shape('param')[0]
167 self.nplots = self.nrows
167 self.nplots = self.nrows
168 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95})
168 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95})
169
169
170 if not self.xlabel:
170 if not self.xlabel:
171 self.xlabel = 'Time'
171 self.xlabel = 'Time'
172
172
173 self.ylabel = 'Height [km]'
173 self.ylabel = 'Height [km]'
174 if not self.titles:
174 if not self.titles:
175 self.titles = ['Param {}'.format(x) for x in range(self.nrows)]
175 self.titles = ['Param {}'.format(x) for x in range(self.nrows)]
176
176
177 def update(self, dataOut):
177 def update(self, dataOut):
178
178
179 data = {
179 data = {
180 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0)
180 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0)
181 }
181 }
182
182
183 meta = {}
183 meta = {}
184
184
185 return data, meta
185 return data, meta
186
186
187 def plot(self):
187 def plot(self):
188 # self.data.normalize_heights()
188 # self.data.normalize_heights()
189 self.x = self.data.times
189 self.x = self.data.times
190 self.y = self.data.yrange
190 self.y = self.data.yrange
191 self.z = self.data['param']
191 self.z = self.data['param']
192
192
193 self.z = numpy.ma.masked_invalid(self.z)
193 self.z = numpy.ma.masked_invalid(self.z)
194
194
195 if self.decimation is None:
195 if self.decimation is None:
196 x, y, z = self.fill_gaps(self.x, self.y, self.z)
196 x, y, z = self.fill_gaps(self.x, self.y, self.z)
197 else:
197 else:
198 x, y, z = self.fill_gaps(*self.decimate())
198 x, y, z = self.fill_gaps(*self.decimate())
199
199
200 for n, ax in enumerate(self.axes):
200 for n, ax in enumerate(self.axes):
201
201
202 self.zmax = self.zmax if self.zmax is not None else numpy.max(
202 self.zmax = self.zmax if self.zmax is not None else numpy.max(
203 self.z[n])
203 self.z[n])
204 self.zmin = self.zmin if self.zmin is not None else numpy.min(
204 self.zmin = self.zmin if self.zmin is not None else numpy.min(
205 self.z[n])
205 self.z[n])
206
206
207 if ax.firsttime:
207 if ax.firsttime:
208 if self.zlimits is not None:
208 if self.zlimits is not None:
209 self.zmin, self.zmax = self.zlimits[n]
209 self.zmin, self.zmax = self.zlimits[n]
210
210
211 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
211 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
212 vmin=self.zmin,
212 vmin=self.zmin,
213 vmax=self.zmax,
213 vmax=self.zmax,
214 cmap=self.cmaps[n]
214 cmap=self.cmaps[n]
215 )
215 )
216 else:
216 else:
217 if self.zlimits is not None:
217 if self.zlimits is not None:
218 self.zmin, self.zmax = self.zlimits[n]
218 self.zmin, self.zmax = self.zlimits[n]
219 ax.collections.remove(ax.collections[0])
219 ax.collections.remove(ax.collections[0])
220 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
220 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
221 vmin=self.zmin,
221 vmin=self.zmin,
222 vmax=self.zmax,
222 vmax=self.zmax,
223 cmap=self.cmaps[n]
223 cmap=self.cmaps[n]
224 )
224 )
225
225
226
226
227 class PolarMapPlot(Plot):
227 class PolarMapPlot(Plot):
228 '''
228 '''
229 Plot for weather radar
229 Plot for weather radar
230 '''
230 '''
231
231
232 CODE = 'param'
232 CODE = 'param'
233 colormap = 'seismic'
233 colormap = 'seismic'
234
234
235 def setup(self):
235 def setup(self):
236 self.ncols = 1
236 self.ncols = 1
237 self.nrows = 1
237 self.nrows = 1
238 self.width = 9
238 self.width = 9
239 self.height = 8
239 self.height = 8
240 self.mode = self.data.meta['mode']
240 self.mode = self.data.meta['mode']
241 if self.channels is not None:
241 if self.channels is not None:
242 self.nplots = len(self.channels)
242 self.nplots = len(self.channels)
243 self.nrows = len(self.channels)
243 self.nrows = len(self.channels)
244 else:
244 else:
245 self.nplots = self.data.shape(self.CODE)[0]
245 self.nplots = self.data.shape(self.CODE)[0]
246 self.nrows = self.nplots
246 self.nrows = self.nplots
247 self.channels = list(range(self.nplots))
247 self.channels = list(range(self.nplots))
248 if self.mode == 'E':
248 if self.mode == 'E':
249 self.xlabel = 'Longitude'
249 self.xlabel = 'Longitude'
250 self.ylabel = 'Latitude'
250 self.ylabel = 'Latitude'
251 else:
251 else:
252 self.xlabel = 'Range (km)'
252 self.xlabel = 'Range (km)'
253 self.ylabel = 'Height (km)'
253 self.ylabel = 'Height (km)'
254 self.bgcolor = 'white'
254 self.bgcolor = 'white'
255 self.cb_labels = self.data.meta['units']
255 self.cb_labels = self.data.meta['units']
256 self.lat = self.data.meta['latitude']
256 self.lat = self.data.meta['latitude']
257 self.lon = self.data.meta['longitude']
257 self.lon = self.data.meta['longitude']
258 self.xmin, self.xmax = float(
258 self.xmin, self.xmax = float(
259 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
259 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
260 self.ymin, self.ymax = float(
260 self.ymin, self.ymax = float(
261 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
261 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
262 # self.polar = True
262 # self.polar = True
263
263
264 def plot(self):
264 def plot(self):
265
265
266 for n, ax in enumerate(self.axes):
266 for n, ax in enumerate(self.axes):
267 data = self.data['param'][self.channels[n]]
267 data = self.data['param'][self.channels[n]]
268
268
269 zeniths = numpy.linspace(
269 zeniths = numpy.linspace(
270 0, self.data.meta['max_range'], data.shape[1])
270 0, self.data.meta['max_range'], data.shape[1])
271 if self.mode == 'E':
271 if self.mode == 'E':
272 azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2
272 azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2
273 r, theta = numpy.meshgrid(zeniths, azimuths)
273 r, theta = numpy.meshgrid(zeniths, azimuths)
274 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
274 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
275 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
275 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
276 x = km2deg(x) + self.lon
276 x = km2deg(x) + self.lon
277 y = km2deg(y) + self.lat
277 y = km2deg(y) + self.lat
278 else:
278 else:
279 azimuths = numpy.radians(self.data.yrange)
279 azimuths = numpy.radians(self.data.yrange)
280 r, theta = numpy.meshgrid(zeniths, azimuths)
280 r, theta = numpy.meshgrid(zeniths, azimuths)
281 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
281 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
282 self.y = zeniths
282 self.y = zeniths
283
283
284 if ax.firsttime:
284 if ax.firsttime:
285 if self.zlimits is not None:
285 if self.zlimits is not None:
286 self.zmin, self.zmax = self.zlimits[n]
286 self.zmin, self.zmax = self.zlimits[n]
287 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
287 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
288 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
288 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
289 vmin=self.zmin,
289 vmin=self.zmin,
290 vmax=self.zmax,
290 vmax=self.zmax,
291 cmap=self.cmaps[n])
291 cmap=self.cmaps[n])
292 else:
292 else:
293 if self.zlimits is not None:
293 if self.zlimits is not None:
294 self.zmin, self.zmax = self.zlimits[n]
294 self.zmin, self.zmax = self.zlimits[n]
295 ax.collections.remove(ax.collections[0])
295 ax.collections.remove(ax.collections[0])
296 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
296 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
297 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
297 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
298 vmin=self.zmin,
298 vmin=self.zmin,
299 vmax=self.zmax,
299 vmax=self.zmax,
300 cmap=self.cmaps[n])
300 cmap=self.cmaps[n])
301
301
302 if self.mode == 'A':
302 if self.mode == 'A':
303 continue
303 continue
304
304
305 # plot district names
305 # plot district names
306 f = open('/data/workspace/schain_scripts/distrito.csv')
306 f = open('/data/workspace/schain_scripts/distrito.csv')
307 for line in f:
307 for line in f:
308 label, lon, lat = [s.strip() for s in line.split(',') if s]
308 label, lon, lat = [s.strip() for s in line.split(',') if s]
309 lat = float(lat)
309 lat = float(lat)
310 lon = float(lon)
310 lon = float(lon)
311 # ax.plot(lon, lat, '.b', ms=2)
311 # ax.plot(lon, lat, '.b', ms=2)
312 ax.text(lon, lat, label.decode('utf8'), ha='center',
312 ax.text(lon, lat, label.decode('utf8'), ha='center',
313 va='bottom', size='8', color='black')
313 va='bottom', size='8', color='black')
314
314
315 # plot limites
315 # plot limites
316 limites = []
316 limites = []
317 tmp = []
317 tmp = []
318 for line in open('/data/workspace/schain_scripts/lima.csv'):
318 for line in open('/data/workspace/schain_scripts/lima.csv'):
319 if '#' in line:
319 if '#' in line:
320 if tmp:
320 if tmp:
321 limites.append(tmp)
321 limites.append(tmp)
322 tmp = []
322 tmp = []
323 continue
323 continue
324 values = line.strip().split(',')
324 values = line.strip().split(',')
325 tmp.append((float(values[0]), float(values[1])))
325 tmp.append((float(values[0]), float(values[1])))
326 for points in limites:
326 for points in limites:
327 ax.add_patch(
327 ax.add_patch(
328 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
328 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
329
329
330 # plot Cuencas
330 # plot Cuencas
331 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
331 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
332 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
332 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
333 values = [line.strip().split(',') for line in f]
333 values = [line.strip().split(',') for line in f]
334 points = [(float(s[0]), float(s[1])) for s in values]
334 points = [(float(s[0]), float(s[1])) for s in values]
335 ax.add_patch(Polygon(points, ec='b', fc='none'))
335 ax.add_patch(Polygon(points, ec='b', fc='none'))
336
336
337 # plot grid
337 # plot grid
338 for r in (15, 30, 45, 60):
338 for r in (15, 30, 45, 60):
339 ax.add_artist(plt.Circle((self.lon, self.lat),
339 ax.add_artist(plt.Circle((self.lon, self.lat),
340 km2deg(r), color='0.6', fill=False, lw=0.2))
340 km2deg(r), color='0.6', fill=False, lw=0.2))
341 ax.text(
341 ax.text(
342 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
342 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
343 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
343 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
344 '{}km'.format(r),
344 '{}km'.format(r),
345 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
345 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
346
346
347 if self.mode == 'E':
347 if self.mode == 'E':
348 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
348 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
349 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
349 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
350 else:
350 else:
351 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
351 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
352 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
352 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
353
353
354 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
354 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
355 self.titles = ['{} {}'.format(
355 self.titles = ['{} {}'.format(
356 self.data.parameters[x], title) for x in self.channels]
356 self.data.parameters[x], title) for x in self.channels]
357
@@ -1,711 +1,712
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
2 # All rights reserved.
2 # All rights reserved.
3 #
3 #
4 # Distributed under the terms of the BSD 3-clause license.
4 # Distributed under the terms of the BSD 3-clause license.
5 """Classes to plot Spectra data
5 """Classes to plot Spectra data
6
6
7 """
7 """
8
8
9 import os
9 import os
10 import numpy
10 import numpy
11
11
12 from schainpy.model.graphics.jroplot_base import Plot, plt, log
12 from schainpy.model.graphics.jroplot_base import Plot, plt, log
13
13
14
14
15 class SpectraPlot(Plot):
15 class SpectraPlot(Plot):
16 '''
16 '''
17 Plot for Spectra data
17 Plot for Spectra data
18 '''
18 '''
19
19
20 CODE = 'spc'
20 CODE = 'spc'
21 colormap = 'jet'
21 colormap = 'jet'
22 plot_type = 'pcolor'
22 plot_type = 'pcolor'
23 buffering = False
23 buffering = False
24 channelList = None
24 channelList = []
25
25
26 def setup(self):
26 def setup(self):
27 self.nplots = len(self.data.channels)
27 self.nplots = len(self.data.channels)
28 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
28 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
29 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
29 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
30 self.height = 2.6 * self.nrows
30 self.height = 2.6 * self.nrows
31
31
32 self.cb_label = 'dB'
32 self.cb_label = 'dB'
33 if self.showprofile:
33 if self.showprofile:
34 self.width = 4 * self.ncols
34 self.width = 4 * self.ncols
35 else:
35 else:
36 self.width = 3.5 * self.ncols
36 self.width = 3.5 * self.ncols
37 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
37 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
38 self.ylabel = 'Range [km]'
38 self.ylabel = 'Range [km]'
39
39
40 def update(self, dataOut):
40 def update(self, dataOut):
41 if self.channelList == None:
41 if self.channelList == None:
42 self.channelList = dataOut.channelList
42 self.channelList = dataOut.channelList
43 data = {}
43 data = {}
44 meta = {}
44 meta = {}
45 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
45 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
46 data['spc'] = spc
46 data['spc'] = spc
47 data['rti'] = dataOut.getPower()
47 data['rti'] = dataOut.getPower()
48 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
48 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
49 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
49 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
50 if self.CODE == 'spc_moments':
50 if self.CODE == 'spc_moments':
51 data['moments'] = dataOut.moments
51 data['moments'] = dataOut.moments
52
52
53 return data, meta
53 return data, meta
54
54
55 def plot(self):
55 def plot(self):
56 if self.xaxis == "frequency":
56 if self.xaxis == "frequency":
57 x = self.data.xrange[0]
57 x = self.data.xrange[0]
58 self.xlabel = "Frequency (kHz)"
58 self.xlabel = "Frequency (kHz)"
59 elif self.xaxis == "time":
59 elif self.xaxis == "time":
60 x = self.data.xrange[1]
60 x = self.data.xrange[1]
61 self.xlabel = "Time (ms)"
61 self.xlabel = "Time (ms)"
62 else:
62 else:
63 x = self.data.xrange[2]
63 x = self.data.xrange[2]
64 self.xlabel = "Velocity (m/s)"
64 self.xlabel = "Velocity (m/s)"
65
65
66 if self.CODE == 'spc_moments':
66 if self.CODE == 'spc_moments':
67 x = self.data.xrange[2]
67 x = self.data.xrange[2]
68 self.xlabel = "Velocity (m/s)"
68 self.xlabel = "Velocity (m/s)"
69
69
70 self.titles = []
70 self.titles = []
71
71
72 y = self.data.yrange
72 y = self.data.yrange
73 self.y = y
73 self.y = y
74
74
75 data = self.data[-1]
75 data = self.data[-1]
76 z = data['spc']
76 z = data['spc']
77
77
78 for n, ax in enumerate(self.axes):
78 for n, ax in enumerate(self.axes):
79 noise = data['noise'][n]
79 noise = data['noise'][n]
80 if self.CODE == 'spc_moments':
80 if self.CODE == 'spc_moments':
81 mean = data['moments'][n, 1]
81 mean = data['moments'][n, 1]
82 if ax.firsttime:
82 if ax.firsttime:
83 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
83 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
84 self.xmin = self.xmin if self.xmin else -self.xmax
84 self.xmin = self.xmin if self.xmin else -self.xmax
85 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
85 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
86 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
86 self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
87 ax.plt = ax.pcolormesh(x, y, z[n].T,
87 ax.plt = ax.pcolormesh(x, y, z[n].T,
88 vmin=self.zmin,
88 vmin=self.zmin,
89 vmax=self.zmax,
89 vmax=self.zmax,
90 cmap=plt.get_cmap(self.colormap)
90 cmap=plt.get_cmap(self.colormap)
91 )
91 )
92
92
93 if self.showprofile:
93 if self.showprofile:
94 ax.plt_profile = self.pf_axes[n].plot(
94 ax.plt_profile = self.pf_axes[n].plot(
95 data['rti'][n], y)[0]
95 data['rti'][n], y)[0]
96 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
96 ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
97 color="k", linestyle="dashed", lw=1)[0]
97 color="k", linestyle="dashed", lw=1)[0]
98 if self.CODE == 'spc_moments':
98 if self.CODE == 'spc_moments':
99 ax.plt_mean = ax.plot(mean, y, color='k')[0]
99 ax.plt_mean = ax.plot(mean, y, color='k')[0]
100 else:
100 else:
101 ax.plt.set_array(z[n].T.ravel())
101 ax.plt.set_array(z[n].T.ravel())
102 if self.showprofile:
102 if self.showprofile:
103 ax.plt_profile.set_data(data['rti'][n], y)
103 ax.plt_profile.set_data(data['rti'][n], y)
104 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
104 ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
105 if self.CODE == 'spc_moments':
105 if self.CODE == 'spc_moments':
106 ax.plt_mean.set_data(mean, y)
106 ax.plt_mean.set_data(mean, y)
107 self.titles.append('CH {}: {:3.2f}dB'.format(self.channelList[n], noise))
107 self.titles.append('CH {}: {:3.2f}dB'.format(self.channelList[n], noise))
108
108
109
109
110 class CrossSpectraPlot(Plot):
110 class CrossSpectraPlot(Plot):
111
111
112 CODE = 'cspc'
112 CODE = 'cspc'
113 colormap = 'jet'
113 colormap = 'jet'
114 plot_type = 'pcolor'
114 plot_type = 'pcolor'
115 zmin_coh = None
115 zmin_coh = None
116 zmax_coh = None
116 zmax_coh = None
117 zmin_phase = None
117 zmin_phase = None
118 zmax_phase = None
118 zmax_phase = None
119
119
120 def setup(self):
120 def setup(self):
121
121
122 self.ncols = 4
122 self.ncols = 4
123 self.nplots = len(self.data.pairs) * 2
123 self.nplots = len(self.data.pairs) * 2
124 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
124 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
125 self.width = 3.1 * self.ncols
125 self.width = 3.1 * self.ncols
126 self.height = 2.6 * self.nrows
126 self.height = 2.6 * self.nrows
127 self.ylabel = 'Range [km]'
127 self.ylabel = 'Range [km]'
128 self.showprofile = False
128 self.showprofile = False
129 self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
129 self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08})
130
130
131 def update(self, dataOut):
131 def update(self, dataOut):
132
132
133 data = {}
133 data = {}
134 meta = {}
134 meta = {}
135
135
136 spc = dataOut.data_spc
136 spc = dataOut.data_spc
137 cspc = dataOut.data_cspc
137 cspc = dataOut.data_cspc
138 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
138 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
139 meta['pairs'] = dataOut.pairsList
139 meta['pairs'] = dataOut.pairsList
140
140
141 tmp = []
141 tmp = []
142
142
143 for n, pair in enumerate(meta['pairs']):
143 for n, pair in enumerate(meta['pairs']):
144 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
144 out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]])
145 coh = numpy.abs(out)
145 coh = numpy.abs(out)
146 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
146 phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi
147 tmp.append(coh)
147 tmp.append(coh)
148 tmp.append(phase)
148 tmp.append(phase)
149
149
150 data['cspc'] = numpy.array(tmp)
150 data['cspc'] = numpy.array(tmp)
151
151
152 return data, meta
152 return data, meta
153
153
154 def plot(self):
154 def plot(self):
155
155
156 if self.xaxis == "frequency":
156 if self.xaxis == "frequency":
157 x = self.data.xrange[0]
157 x = self.data.xrange[0]
158 self.xlabel = "Frequency (kHz)"
158 self.xlabel = "Frequency (kHz)"
159 elif self.xaxis == "time":
159 elif self.xaxis == "time":
160 x = self.data.xrange[1]
160 x = self.data.xrange[1]
161 self.xlabel = "Time (ms)"
161 self.xlabel = "Time (ms)"
162 else:
162 else:
163 x = self.data.xrange[2]
163 x = self.data.xrange[2]
164 self.xlabel = "Velocity (m/s)"
164 self.xlabel = "Velocity (m/s)"
165
165
166 self.titles = []
166 self.titles = []
167
167
168 y = self.data.yrange
168 y = self.data.yrange
169 self.y = y
169 self.y = y
170
170
171 data = self.data[-1]
171 data = self.data[-1]
172 cspc = data['cspc']
172 cspc = data['cspc']
173
173
174 for n in range(len(self.data.pairs)):
174 for n in range(len(self.data.pairs)):
175 pair = self.data.pairs[n]
175 pair = self.data.pairs[n]
176 coh = cspc[n*2]
176 coh = cspc[n*2]
177 phase = cspc[n*2+1]
177 phase = cspc[n*2+1]
178 ax = self.axes[2 * n]
178 ax = self.axes[2 * n]
179 if ax.firsttime:
179 if ax.firsttime:
180 ax.plt = ax.pcolormesh(x, y, coh.T,
180 ax.plt = ax.pcolormesh(x, y, coh.T,
181 vmin=0,
181 vmin=0,
182 vmax=1,
182 vmax=1,
183 cmap=plt.get_cmap(self.colormap_coh)
183 cmap=plt.get_cmap(self.colormap_coh)
184 )
184 )
185 else:
185 else:
186 ax.plt.set_array(coh.T.ravel())
186 ax.plt.set_array(coh.T.ravel())
187 self.titles.append(
187 self.titles.append(
188 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
188 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
189
189
190 ax = self.axes[2 * n + 1]
190 ax = self.axes[2 * n + 1]
191 if ax.firsttime:
191 if ax.firsttime:
192 ax.plt = ax.pcolormesh(x, y, phase.T,
192 ax.plt = ax.pcolormesh(x, y, phase.T,
193 vmin=-180,
193 vmin=-180,
194 vmax=180,
194 vmax=180,
195 cmap=plt.get_cmap(self.colormap_phase)
195 cmap=plt.get_cmap(self.colormap_phase)
196 )
196 )
197 else:
197 else:
198 ax.plt.set_array(phase.T.ravel())
198 ax.plt.set_array(phase.T.ravel())
199 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
199 self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
200
200
201
201
202 class RTIPlot(Plot):
202 class RTIPlot(Plot):
203 '''
203 '''
204 Plot for RTI data
204 Plot for RTI data
205 '''
205 '''
206
206
207 CODE = 'rti'
207 CODE = 'rti'
208 colormap = 'jet'
208 colormap = 'jet'
209 plot_type = 'pcolorbuffer'
209 plot_type = 'pcolorbuffer'
210 titles = None
210 titles = None
211 channelList = None
211 channelList = []
212
212
213 def setup(self):
213 def setup(self):
214 self.xaxis = 'time'
214 self.xaxis = 'time'
215 self.ncols = 1
215 self.ncols = 1
216 print("dataChannels ",self.data.channels)
216 self.nrows = len(self.data.channels)
217 self.nrows = len(self.data.channels)
217 self.nplots = len(self.data.channels)
218 self.nplots = len(self.data.channels)
218 self.ylabel = 'Range [km]'
219 self.ylabel = 'Range [km]'
219 self.xlabel = 'Time'
220 self.xlabel = 'Time'
220 self.cb_label = 'dB'
221 self.cb_label = 'dB'
221 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95})
222 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95})
222 self.titles = ['{} Channel {}'.format(
223 self.titles = ['{} Channel {}'.format(
223 self.CODE.upper(), x) for x in range(self.nplots)]
224 self.CODE.upper(), x) for x in range(self.nplots)]
224
225 print("SETUP")
225 def update(self, dataOut):
226 def update(self, dataOut):
226 if self.channelList == None:
227 if len(self.channelList) == 0:
227 self.channelList = dataOut.channelList
228 self.channelList = dataOut.channelList
228 data = {}
229 data = {}
229 meta = {}
230 meta = {}
230 data['rti'] = dataOut.getPower()
231 data['rti'] = dataOut.getPower()
231 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
232 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor)
232
233
233 return data, meta
234 return data, meta
234
235
235 def plot(self):
236 def plot(self):
236 self.x = self.data.times
237 self.x = self.data.times
237 self.y = self.data.yrange
238 self.y = self.data.yrange
238 self.z = self.data[self.CODE]
239 self.z = self.data[self.CODE]
239 self.z = numpy.ma.masked_invalid(self.z)
240 self.z = numpy.ma.masked_invalid(self.z)
240 if self.channelList != None:
241 if self.channelList != None:
241 self.titles = ['{} Channel {}'.format(
242 self.titles = ['{} Channel {}'.format(
242 self.CODE.upper(), x) for x in self.channelList]
243 self.CODE.upper(), x) for x in self.channelList]
243
244
244 if self.decimation is None:
245 if self.decimation is None:
245 x, y, z = self.fill_gaps(self.x, self.y, self.z)
246 x, y, z = self.fill_gaps(self.x, self.y, self.z)
246 else:
247 else:
247 x, y, z = self.fill_gaps(*self.decimate())
248 x, y, z = self.fill_gaps(*self.decimate())
248
249
249 for n, ax in enumerate(self.axes):
250 for n, ax in enumerate(self.axes):
250 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
251 self.zmin = self.zmin if self.zmin else numpy.min(self.z)
251 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
252 self.zmax = self.zmax if self.zmax else numpy.max(self.z)
252 data = self.data[-1]
253 data = self.data[-1]
253 if ax.firsttime:
254 if ax.firsttime:
254 ax.plt = ax.pcolormesh(x, y, z[n].T,
255 ax.plt = ax.pcolormesh(x, y, z[n].T,
255 vmin=self.zmin,
256 vmin=self.zmin,
256 vmax=self.zmax,
257 vmax=self.zmax,
257 cmap=plt.get_cmap(self.colormap)
258 cmap=plt.get_cmap(self.colormap)
258 )
259 )
259 if self.showprofile:
260 if self.showprofile:
260 ax.plot_profile = self.pf_axes[n].plot(
261 ax.plot_profile = self.pf_axes[n].plot(
261 data['rti'][n], self.y)[0]
262 data['rti'][n], self.y)[0]
262 ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(data['noise'][n], len(self.y)), self.y,
263 ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(data['noise'][n], len(self.y)), self.y,
263 color="k", linestyle="dashed", lw=1)[0]
264 color="k", linestyle="dashed", lw=1)[0]
264 else:
265 else:
265 ax.collections.remove(ax.collections[0])
266 ax.collections.remove(ax.collections[0])
266 ax.plt = ax.pcolormesh(x, y, z[n].T,
267 ax.plt = ax.pcolormesh(x, y, z[n].T,
267 vmin=self.zmin,
268 vmin=self.zmin,
268 vmax=self.zmax,
269 vmax=self.zmax,
269 cmap=plt.get_cmap(self.colormap)
270 cmap=plt.get_cmap(self.colormap)
270 )
271 )
271 if self.showprofile:
272 if self.showprofile:
272 ax.plot_profile.set_data(data['rti'][n], self.y)
273 ax.plot_profile.set_data(data['rti'][n], self.y)
273 ax.plot_noise.set_data(numpy.repeat(
274 ax.plot_noise.set_data(numpy.repeat(
274 data['noise'][n], len(self.y)), self.y)
275 data['noise'][n], len(self.y)), self.y)
275
276
276
277
277 class CoherencePlot(RTIPlot):
278 class CoherencePlot(RTIPlot):
278 '''
279 '''
279 Plot for Coherence data
280 Plot for Coherence data
280 '''
281 '''
281
282
282 CODE = 'coh'
283 CODE = 'coh'
283
284
284 def setup(self):
285 def setup(self):
285 self.xaxis = 'time'
286 self.xaxis = 'time'
286 self.ncols = 1
287 self.ncols = 1
287 self.nrows = len(self.data.pairs)
288 self.nrows = len(self.data.pairs)
288 self.nplots = len(self.data.pairs)
289 self.nplots = len(self.data.pairs)
289 self.ylabel = 'Range [km]'
290 self.ylabel = 'Range [km]'
290 self.xlabel = 'Time'
291 self.xlabel = 'Time'
291 self.plots_adjust.update({'hspace':0.6, 'left': 0.1, 'bottom': 0.1,'right':0.95})
292 self.plots_adjust.update({'hspace':0.6, 'left': 0.1, 'bottom': 0.1,'right':0.95})
292 if self.CODE == 'coh':
293 if self.CODE == 'coh':
293 self.cb_label = ''
294 self.cb_label = ''
294 self.titles = [
295 self.titles = [
295 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
296 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
296 else:
297 else:
297 self.cb_label = 'Degrees'
298 self.cb_label = 'Degrees'
298 self.titles = [
299 self.titles = [
299 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
300 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
300
301
301 def update(self, dataOut):
302 def update(self, dataOut):
302
303
303 data = {}
304 data = {}
304 meta = {}
305 meta = {}
305 data['coh'] = dataOut.getCoherence()
306 data['coh'] = dataOut.getCoherence()
306 meta['pairs'] = dataOut.pairsList
307 meta['pairs'] = dataOut.pairsList
307
308
308 return data, meta
309 return data, meta
309
310
310 class PhasePlot(CoherencePlot):
311 class PhasePlot(CoherencePlot):
311 '''
312 '''
312 Plot for Phase map data
313 Plot for Phase map data
313 '''
314 '''
314
315
315 CODE = 'phase'
316 CODE = 'phase'
316 colormap = 'seismic'
317 colormap = 'seismic'
317
318
318 def update(self, dataOut):
319 def update(self, dataOut):
319
320
320 data = {}
321 data = {}
321 meta = {}
322 meta = {}
322 data['phase'] = dataOut.getCoherence(phase=True)
323 data['phase'] = dataOut.getCoherence(phase=True)
323 meta['pairs'] = dataOut.pairsList
324 meta['pairs'] = dataOut.pairsList
324
325
325 return data, meta
326 return data, meta
326
327
327 class NoisePlot(Plot):
328 class NoisePlot(Plot):
328 '''
329 '''
329 Plot for noise
330 Plot for noise
330 '''
331 '''
331
332
332 CODE = 'noise'
333 CODE = 'noise'
333 plot_type = 'scatterbuffer'
334 plot_type = 'scatterbuffer'
334
335
335 def setup(self):
336 def setup(self):
336 self.xaxis = 'time'
337 self.xaxis = 'time'
337 self.ncols = 1
338 self.ncols = 1
338 self.nrows = 1
339 self.nrows = 1
339 self.nplots = 1
340 self.nplots = 1
340 self.ylabel = 'Intensity [dB]'
341 self.ylabel = 'Intensity [dB]'
341 self.xlabel = 'Time'
342 self.xlabel = 'Time'
342 self.titles = ['Noise']
343 self.titles = ['Noise']
343 self.colorbar = False
344 self.colorbar = False
344 self.plots_adjust.update({'right': 0.85 })
345 self.plots_adjust.update({'right': 0.85 })
345
346
346 def update(self, dataOut):
347 def update(self, dataOut):
347
348
348 data = {}
349 data = {}
349 meta = {}
350 meta = {}
350 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor).reshape(dataOut.nChannels, 1)
351 data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor).reshape(dataOut.nChannels, 1)
351 meta['yrange'] = numpy.array([])
352 meta['yrange'] = numpy.array([])
352
353
353 return data, meta
354 return data, meta
354
355
355 def plot(self):
356 def plot(self):
356
357
357 x = self.data.times
358 x = self.data.times
358 xmin = self.data.min_time
359 xmin = self.data.min_time
359 xmax = xmin + self.xrange * 60 * 60
360 xmax = xmin + self.xrange * 60 * 60
360 Y = self.data['noise']
361 Y = self.data['noise']
361
362
362 if self.axes[0].firsttime:
363 if self.axes[0].firsttime:
363 self.ymin = numpy.nanmin(Y) - 5
364 self.ymin = numpy.nanmin(Y) - 5
364 self.ymax = numpy.nanmax(Y) + 5
365 self.ymax = numpy.nanmax(Y) + 5
365 for ch in self.data.channels:
366 for ch in self.data.channels:
366 y = Y[ch]
367 y = Y[ch]
367 self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
368 self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
368 plt.legend(bbox_to_anchor=(1.18, 1.0))
369 plt.legend(bbox_to_anchor=(1.18, 1.0))
369 else:
370 else:
370 for ch in self.data.channels:
371 for ch in self.data.channels:
371 y = Y[ch]
372 y = Y[ch]
372 self.axes[0].lines[ch].set_data(x, y)
373 self.axes[0].lines[ch].set_data(x, y)
373
374
374
375
375 class PowerProfilePlot(Plot):
376 class PowerProfilePlot(Plot):
376
377
377 CODE = 'pow_profile'
378 CODE = 'pow_profile'
378 plot_type = 'scatter'
379 plot_type = 'scatter'
379
380
380 def setup(self):
381 def setup(self):
381
382
382 self.ncols = 1
383 self.ncols = 1
383 self.nrows = 1
384 self.nrows = 1
384 self.nplots = 1
385 self.nplots = 1
385 self.height = 4
386 self.height = 4
386 self.width = 3
387 self.width = 3
387 self.ylabel = 'Range [km]'
388 self.ylabel = 'Range [km]'
388 self.xlabel = 'Intensity [dB]'
389 self.xlabel = 'Intensity [dB]'
389 self.titles = ['Power Profile']
390 self.titles = ['Power Profile']
390 self.colorbar = False
391 self.colorbar = False
391
392
392 def update(self, dataOut):
393 def update(self, dataOut):
393
394
394 data = {}
395 data = {}
395 meta = {}
396 meta = {}
396 data[self.CODE] = dataOut.getPower()
397 data[self.CODE] = dataOut.getPower()
397
398
398 return data, meta
399 return data, meta
399
400
400 def plot(self):
401 def plot(self):
401
402
402 y = self.data.yrange
403 y = self.data.yrange
403 self.y = y
404 self.y = y
404
405
405 x = self.data[-1][self.CODE]
406 x = self.data[-1][self.CODE]
406
407
407 if self.xmin is None: self.xmin = numpy.nanmin(x)*0.9
408 if self.xmin is None: self.xmin = numpy.nanmin(x)*0.9
408 if self.xmax is None: self.xmax = numpy.nanmax(x)*1.1
409 if self.xmax is None: self.xmax = numpy.nanmax(x)*1.1
409
410
410 if self.axes[0].firsttime:
411 if self.axes[0].firsttime:
411 for ch in self.data.channels:
412 for ch in self.data.channels:
412 self.axes[0].plot(x[ch], y, lw=1, label='Ch{}'.format(ch))
413 self.axes[0].plot(x[ch], y, lw=1, label='Ch{}'.format(ch))
413 plt.legend()
414 plt.legend()
414 else:
415 else:
415 for ch in self.data.channels:
416 for ch in self.data.channels:
416 self.axes[0].lines[ch].set_data(x[ch], y)
417 self.axes[0].lines[ch].set_data(x[ch], y)
417
418
418
419
419 class SpectraCutPlot(Plot):
420 class SpectraCutPlot(Plot):
420
421
421 CODE = 'spc_cut'
422 CODE = 'spc_cut'
422 plot_type = 'scatter'
423 plot_type = 'scatter'
423 buffering = False
424 buffering = False
424
425
425 def setup(self):
426 def setup(self):
426
427
427 self.nplots = len(self.data.channels)
428 self.nplots = len(self.data.channels)
428 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
429 self.ncols = int(numpy.sqrt(self.nplots) + 0.9)
429 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
430 self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9)
430 self.width = 3.4 * self.ncols + 1.5
431 self.width = 3.4 * self.ncols + 1.5
431 self.height = 3 * self.nrows
432 self.height = 3 * self.nrows
432 self.ylabel = 'Power [dB]'
433 self.ylabel = 'Power [dB]'
433 self.colorbar = False
434 self.colorbar = False
434 self.plots_adjust.update({'left':0.1, 'hspace':0.3, 'right': 0.75, 'bottom':0.08})
435 self.plots_adjust.update({'left':0.1, 'hspace':0.3, 'right': 0.75, 'bottom':0.08})
435
436
436 def update(self, dataOut):
437 def update(self, dataOut):
437
438
438 data = {}
439 data = {}
439 meta = {}
440 meta = {}
440 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
441 spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor)
441 data['spc'] = spc
442 data['spc'] = spc
442 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
443 meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1))
443
444
444 return data, meta
445 return data, meta
445
446
446 def plot(self):
447 def plot(self):
447 if self.xaxis == "frequency":
448 if self.xaxis == "frequency":
448 x = self.data.xrange[0][1:]
449 x = self.data.xrange[0][1:]
449 self.xlabel = "Frequency (kHz)"
450 self.xlabel = "Frequency (kHz)"
450 elif self.xaxis == "time":
451 elif self.xaxis == "time":
451 x = self.data.xrange[1]
452 x = self.data.xrange[1]
452 self.xlabel = "Time (ms)"
453 self.xlabel = "Time (ms)"
453 else:
454 else:
454 x = self.data.xrange[2]
455 x = self.data.xrange[2]
455 self.xlabel = "Velocity (m/s)"
456 self.xlabel = "Velocity (m/s)"
456
457
457 self.titles = []
458 self.titles = []
458
459
459 y = self.data.yrange
460 y = self.data.yrange
460 z = self.data[-1]['spc']
461 z = self.data[-1]['spc']
461
462
462 if self.height_index:
463 if self.height_index:
463 index = numpy.array(self.height_index)
464 index = numpy.array(self.height_index)
464 else:
465 else:
465 index = numpy.arange(0, len(y), int((len(y))/9))
466 index = numpy.arange(0, len(y), int((len(y))/9))
466
467
467 for n, ax in enumerate(self.axes):
468 for n, ax in enumerate(self.axes):
468 if ax.firsttime:
469 if ax.firsttime:
469 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
470 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
470 self.xmin = self.xmin if self.xmin else -self.xmax
471 self.xmin = self.xmin if self.xmin else -self.xmax
471 self.ymin = self.ymin if self.ymin else numpy.nanmin(z)
472 self.ymin = self.ymin if self.ymin else numpy.nanmin(z)
472 self.ymax = self.ymax if self.ymax else numpy.nanmax(z)
473 self.ymax = self.ymax if self.ymax else numpy.nanmax(z)
473 ax.plt = ax.plot(x, z[n, :, index].T)
474 ax.plt = ax.plot(x, z[n, :, index].T)
474 labels = ['Range = {:2.1f}km'.format(y[i]) for i in index]
475 labels = ['Range = {:2.1f}km'.format(y[i]) for i in index]
475 self.figures[0].legend(ax.plt, labels, loc='center right')
476 self.figures[0].legend(ax.plt, labels, loc='center right')
476 else:
477 else:
477 for i, line in enumerate(ax.plt):
478 for i, line in enumerate(ax.plt):
478 line.set_data(x, z[n, :, index[i]])
479 line.set_data(x, z[n, :, index[i]])
479 self.titles.append('CH {}'.format(n))
480 self.titles.append('CH {}'.format(n))
480
481
481
482
482 class BeaconPhase(Plot):
483 class BeaconPhase(Plot):
483
484
484 __isConfig = None
485 __isConfig = None
485 __nsubplots = None
486 __nsubplots = None
486
487
487 PREFIX = 'beacon_phase'
488 PREFIX = 'beacon_phase'
488
489
489 def __init__(self):
490 def __init__(self):
490 Plot.__init__(self)
491 Plot.__init__(self)
491 self.timerange = 24*60*60
492 self.timerange = 24*60*60
492 self.isConfig = False
493 self.isConfig = False
493 self.__nsubplots = 1
494 self.__nsubplots = 1
494 self.counter_imagwr = 0
495 self.counter_imagwr = 0
495 self.WIDTH = 800
496 self.WIDTH = 800
496 self.HEIGHT = 400
497 self.HEIGHT = 400
497 self.WIDTHPROF = 120
498 self.WIDTHPROF = 120
498 self.HEIGHTPROF = 0
499 self.HEIGHTPROF = 0
499 self.xdata = None
500 self.xdata = None
500 self.ydata = None
501 self.ydata = None
501
502
502 self.PLOT_CODE = BEACON_CODE
503 self.PLOT_CODE = BEACON_CODE
503
504
504 self.FTP_WEI = None
505 self.FTP_WEI = None
505 self.EXP_CODE = None
506 self.EXP_CODE = None
506 self.SUB_EXP_CODE = None
507 self.SUB_EXP_CODE = None
507 self.PLOT_POS = None
508 self.PLOT_POS = None
508
509
509 self.filename_phase = None
510 self.filename_phase = None
510
511
511 self.figfile = None
512 self.figfile = None
512
513
513 self.xmin = None
514 self.xmin = None
514 self.xmax = None
515 self.xmax = None
515
516
516 def getSubplots(self):
517 def getSubplots(self):
517
518
518 ncol = 1
519 ncol = 1
519 nrow = 1
520 nrow = 1
520
521
521 return nrow, ncol
522 return nrow, ncol
522
523
523 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
524 def setup(self, id, nplots, wintitle, showprofile=True, show=True):
524
525
525 self.__showprofile = showprofile
526 self.__showprofile = showprofile
526 self.nplots = nplots
527 self.nplots = nplots
527
528
528 ncolspan = 7
529 ncolspan = 7
529 colspan = 6
530 colspan = 6
530 self.__nsubplots = 2
531 self.__nsubplots = 2
531
532
532 self.createFigure(id = id,
533 self.createFigure(id = id,
533 wintitle = wintitle,
534 wintitle = wintitle,
534 widthplot = self.WIDTH+self.WIDTHPROF,
535 widthplot = self.WIDTH+self.WIDTHPROF,
535 heightplot = self.HEIGHT+self.HEIGHTPROF,
536 heightplot = self.HEIGHT+self.HEIGHTPROF,
536 show=show)
537 show=show)
537
538
538 nrow, ncol = self.getSubplots()
539 nrow, ncol = self.getSubplots()
539
540
540 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
541 self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1)
541
542
542 def save_phase(self, filename_phase):
543 def save_phase(self, filename_phase):
543 f = open(filename_phase,'w+')
544 f = open(filename_phase,'w+')
544 f.write('\n\n')
545 f.write('\n\n')
545 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
546 f.write('JICAMARCA RADIO OBSERVATORY - Beacon Phase \n')
546 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
547 f.write('DD MM YYYY HH MM SS pair(2,0) pair(2,1) pair(2,3) pair(2,4)\n\n' )
547 f.close()
548 f.close()
548
549
549 def save_data(self, filename_phase, data, data_datetime):
550 def save_data(self, filename_phase, data, data_datetime):
550 f=open(filename_phase,'a')
551 f=open(filename_phase,'a')
551 timetuple_data = data_datetime.timetuple()
552 timetuple_data = data_datetime.timetuple()
552 day = str(timetuple_data.tm_mday)
553 day = str(timetuple_data.tm_mday)
553 month = str(timetuple_data.tm_mon)
554 month = str(timetuple_data.tm_mon)
554 year = str(timetuple_data.tm_year)
555 year = str(timetuple_data.tm_year)
555 hour = str(timetuple_data.tm_hour)
556 hour = str(timetuple_data.tm_hour)
556 minute = str(timetuple_data.tm_min)
557 minute = str(timetuple_data.tm_min)
557 second = str(timetuple_data.tm_sec)
558 second = str(timetuple_data.tm_sec)
558 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
559 f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n')
559 f.close()
560 f.close()
560
561
561 def plot(self):
562 def plot(self):
562 log.warning('TODO: Not yet implemented...')
563 log.warning('TODO: Not yet implemented...')
563
564
564 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
565 def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True',
565 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
566 xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None,
566 timerange=None,
567 timerange=None,
567 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
568 save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1,
568 server=None, folder=None, username=None, password=None,
569 server=None, folder=None, username=None, password=None,
569 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
570 ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0):
570
571
571 if dataOut.flagNoData:
572 if dataOut.flagNoData:
572 return dataOut
573 return dataOut
573
574
574 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
575 if not isTimeInHourRange(dataOut.datatime, xmin, xmax):
575 return
576 return
576
577
577 if pairsList == None:
578 if pairsList == None:
578 pairsIndexList = dataOut.pairsIndexList[:10]
579 pairsIndexList = dataOut.pairsIndexList[:10]
579 else:
580 else:
580 pairsIndexList = []
581 pairsIndexList = []
581 for pair in pairsList:
582 for pair in pairsList:
582 if pair not in dataOut.pairsList:
583 if pair not in dataOut.pairsList:
583 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
584 raise ValueError("Pair %s is not in dataOut.pairsList" %(pair))
584 pairsIndexList.append(dataOut.pairsList.index(pair))
585 pairsIndexList.append(dataOut.pairsList.index(pair))
585
586
586 if pairsIndexList == []:
587 if pairsIndexList == []:
587 return
588 return
588
589
589 # if len(pairsIndexList) > 4:
590 # if len(pairsIndexList) > 4:
590 # pairsIndexList = pairsIndexList[0:4]
591 # pairsIndexList = pairsIndexList[0:4]
591
592
592 hmin_index = None
593 hmin_index = None
593 hmax_index = None
594 hmax_index = None
594
595
595 if hmin != None and hmax != None:
596 if hmin != None and hmax != None:
596 indexes = numpy.arange(dataOut.nHeights)
597 indexes = numpy.arange(dataOut.nHeights)
597 hmin_list = indexes[dataOut.heightList >= hmin]
598 hmin_list = indexes[dataOut.heightList >= hmin]
598 hmax_list = indexes[dataOut.heightList <= hmax]
599 hmax_list = indexes[dataOut.heightList <= hmax]
599
600
600 if hmin_list.any():
601 if hmin_list.any():
601 hmin_index = hmin_list[0]
602 hmin_index = hmin_list[0]
602
603
603 if hmax_list.any():
604 if hmax_list.any():
604 hmax_index = hmax_list[-1]+1
605 hmax_index = hmax_list[-1]+1
605
606
606 x = dataOut.getTimeRange()
607 x = dataOut.getTimeRange()
607
608
608 thisDatetime = dataOut.datatime
609 thisDatetime = dataOut.datatime
609
610
610 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
611 title = wintitle + " Signal Phase" # : %s" %(thisDatetime.strftime("%d-%b-%Y"))
611 xlabel = "Local Time"
612 xlabel = "Local Time"
612 ylabel = "Phase (degrees)"
613 ylabel = "Phase (degrees)"
613
614
614 update_figfile = False
615 update_figfile = False
615
616
616 nplots = len(pairsIndexList)
617 nplots = len(pairsIndexList)
617 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
618 #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList)))
618 phase_beacon = numpy.zeros(len(pairsIndexList))
619 phase_beacon = numpy.zeros(len(pairsIndexList))
619 for i in range(nplots):
620 for i in range(nplots):
620 pair = dataOut.pairsList[pairsIndexList[i]]
621 pair = dataOut.pairsList[pairsIndexList[i]]
621 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
622 ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i], :, hmin_index:hmax_index], axis=0)
622 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
623 powa = numpy.average(dataOut.data_spc[pair[0], :, hmin_index:hmax_index], axis=0)
623 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
624 powb = numpy.average(dataOut.data_spc[pair[1], :, hmin_index:hmax_index], axis=0)
624 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
625 avgcoherenceComplex = ccf/numpy.sqrt(powa*powb)
625 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
626 phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi
626
627
627 if dataOut.beacon_heiIndexList:
628 if dataOut.beacon_heiIndexList:
628 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
629 phase_beacon[i] = numpy.average(phase[dataOut.beacon_heiIndexList])
629 else:
630 else:
630 phase_beacon[i] = numpy.average(phase)
631 phase_beacon[i] = numpy.average(phase)
631
632
632 if not self.isConfig:
633 if not self.isConfig:
633
634
634 nplots = len(pairsIndexList)
635 nplots = len(pairsIndexList)
635
636
636 self.setup(id=id,
637 self.setup(id=id,
637 nplots=nplots,
638 nplots=nplots,
638 wintitle=wintitle,
639 wintitle=wintitle,
639 showprofile=showprofile,
640 showprofile=showprofile,
640 show=show)
641 show=show)
641
642
642 if timerange != None:
643 if timerange != None:
643 self.timerange = timerange
644 self.timerange = timerange
644
645
645 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
646 self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange)
646
647
647 if ymin == None: ymin = 0
648 if ymin == None: ymin = 0
648 if ymax == None: ymax = 360
649 if ymax == None: ymax = 360
649
650
650 self.FTP_WEI = ftp_wei
651 self.FTP_WEI = ftp_wei
651 self.EXP_CODE = exp_code
652 self.EXP_CODE = exp_code
652 self.SUB_EXP_CODE = sub_exp_code
653 self.SUB_EXP_CODE = sub_exp_code
653 self.PLOT_POS = plot_pos
654 self.PLOT_POS = plot_pos
654
655
655 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
656 self.name = thisDatetime.strftime("%Y%m%d_%H%M%S")
656 self.isConfig = True
657 self.isConfig = True
657 self.figfile = figfile
658 self.figfile = figfile
658 self.xdata = numpy.array([])
659 self.xdata = numpy.array([])
659 self.ydata = numpy.array([])
660 self.ydata = numpy.array([])
660
661
661 update_figfile = True
662 update_figfile = True
662
663
663 #open file beacon phase
664 #open file beacon phase
664 path = '%s%03d' %(self.PREFIX, self.id)
665 path = '%s%03d' %(self.PREFIX, self.id)
665 beacon_file = os.path.join(path,'%s.txt'%self.name)
666 beacon_file = os.path.join(path,'%s.txt'%self.name)
666 self.filename_phase = os.path.join(figpath,beacon_file)
667 self.filename_phase = os.path.join(figpath,beacon_file)
667 #self.save_phase(self.filename_phase)
668 #self.save_phase(self.filename_phase)
668
669
669
670
670 #store data beacon phase
671 #store data beacon phase
671 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
672 #self.save_data(self.filename_phase, phase_beacon, thisDatetime)
672
673
673 self.setWinTitle(title)
674 self.setWinTitle(title)
674
675
675
676
676 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
677 title = "Phase Plot %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S"))
677
678
678 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
679 legendlabels = ["Pair (%d,%d)"%(pair[0], pair[1]) for pair in dataOut.pairsList]
679
680
680 axes = self.axesList[0]
681 axes = self.axesList[0]
681
682
682 self.xdata = numpy.hstack((self.xdata, x[0:1]))
683 self.xdata = numpy.hstack((self.xdata, x[0:1]))
683
684
684 if len(self.ydata)==0:
685 if len(self.ydata)==0:
685 self.ydata = phase_beacon.reshape(-1,1)
686 self.ydata = phase_beacon.reshape(-1,1)
686 else:
687 else:
687 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
688 self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1)))
688
689
689
690
690 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
691 axes.pmultilineyaxis(x=self.xdata, y=self.ydata,
691 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
692 xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax,
692 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
693 xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid",
693 XAxisAsTime=True, grid='both'
694 XAxisAsTime=True, grid='both'
694 )
695 )
695
696
696 self.draw()
697 self.draw()
697
698
698 if dataOut.ltctime >= self.xmax:
699 if dataOut.ltctime >= self.xmax:
699 self.counter_imagwr = wr_period
700 self.counter_imagwr = wr_period
700 self.isConfig = False
701 self.isConfig = False
701 update_figfile = True
702 update_figfile = True
702
703
703 self.save(figpath=figpath,
704 self.save(figpath=figpath,
704 figfile=figfile,
705 figfile=figfile,
705 save=save,
706 save=save,
706 ftp=ftp,
707 ftp=ftp,
707 wr_period=wr_period,
708 wr_period=wr_period,
708 thisDatetime=thisDatetime,
709 thisDatetime=thisDatetime,
709 update_figfile=update_figfile)
710 update_figfile=update_figfile)
710
711
711 return dataOut
712 return dataOut
@@ -1,1575 +1,1575
1 """
1 """
2 Created on Jul 2, 2014
2 Created on Jul 2, 2014
3
3
4 @author: roj-idl71
4 @author: roj-idl71
5 """
5 """
6 import os
6 import os
7 import sys
7 import sys
8 import glob
8 import glob
9 import time
9 import time
10 import numpy
10 import numpy
11 import fnmatch
11 import fnmatch
12 import inspect
12 import inspect
13 import time
13 import time
14 import datetime
14 import datetime
15 import zmq
15 import zmq
16
16
17 from schainpy.model.proc.jroproc_base import Operation, MPDecorator
17 from schainpy.model.proc.jroproc_base import Operation, MPDecorator
18 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
18 from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader
19 from schainpy.model.data.jroheaderIO import get_dtype_index, get_numpy_dtype, get_procflag_dtype, get_dtype_width
19 from schainpy.model.data.jroheaderIO import get_dtype_index, get_numpy_dtype, get_procflag_dtype, get_dtype_width
20 from schainpy.utils import log
20 from schainpy.utils import log
21 import schainpy.admin
21 import schainpy.admin
22
22
23 LOCALTIME = True
23 LOCALTIME = True
24 DT_DIRECTIVES = {
24 DT_DIRECTIVES = {
25 '%Y': 4,
25 '%Y': 4,
26 '%y': 2,
26 '%y': 2,
27 '%m': 2,
27 '%m': 2,
28 '%d': 2,
28 '%d': 2,
29 '%j': 3,
29 '%j': 3,
30 '%H': 2,
30 '%H': 2,
31 '%M': 2,
31 '%M': 2,
32 '%S': 2,
32 '%S': 2,
33 '%f': 6
33 '%f': 6
34 }
34 }
35
35
36
36
37 def isNumber(cad):
37 def isNumber(cad):
38 """
38 """
39 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
39 Chequea si el conjunto de caracteres que componen un string puede ser convertidos a un numero.
40
40
41 Excepciones:
41 Excepciones:
42 Si un determinado string no puede ser convertido a numero
42 Si un determinado string no puede ser convertido a numero
43 Input:
43 Input:
44 str, string al cual se le analiza para determinar si convertible a un numero o no
44 str, string al cual se le analiza para determinar si convertible a un numero o no
45
45
46 Return:
46 Return:
47 True : si el string es uno numerico
47 True : si el string es uno numerico
48 False : no es un string numerico
48 False : no es un string numerico
49 """
49 """
50 try:
50 try:
51 float(cad)
51 float(cad)
52 return True
52 return True
53 except:
53 except:
54 return False
54 return False
55
55
56
56
57 def isFileInEpoch(filename, startUTSeconds, endUTSeconds):
57 def isFileInEpoch(filename, startUTSeconds, endUTSeconds):
58 """
58 """
59 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
59 Esta funcion determina si un archivo de datos se encuentra o no dentro del rango de fecha especificado.
60
60
61 Inputs:
61 Inputs:
62 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
62 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
63
63
64 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
64 startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en
65 segundos contados desde 01/01/1970.
65 segundos contados desde 01/01/1970.
66 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
66 endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en
67 segundos contados desde 01/01/1970.
67 segundos contados desde 01/01/1970.
68
68
69 Return:
69 Return:
70 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
70 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
71 fecha especificado, de lo contrario retorna False.
71 fecha especificado, de lo contrario retorna False.
72
72
73 Excepciones:
73 Excepciones:
74 Si el archivo no existe o no puede ser abierto
74 Si el archivo no existe o no puede ser abierto
75 Si la cabecera no puede ser leida.
75 Si la cabecera no puede ser leida.
76
76
77 """
77 """
78 basicHeaderObj = BasicHeader(LOCALTIME)
78 basicHeaderObj = BasicHeader(LOCALTIME)
79
79
80 try:
80 try:
81 fp = open(filename, 'rb')
81 fp = open(filename, 'rb')
82 except IOError:
82 except IOError:
83 print("The file %s can't be opened" % (filename))
83 print("The file %s can't be opened" % (filename))
84 return 0
84 return 0
85
85
86 sts = basicHeaderObj.read(fp)
86 sts = basicHeaderObj.read(fp)
87 fp.close()
87 fp.close()
88
88
89 if not(sts):
89 if not(sts):
90 print("Skipping the file %s because it has not a valid header" % (filename))
90 print("Skipping the file %s because it has not a valid header" % (filename))
91 return 0
91 return 0
92
92
93 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
93 if not ((startUTSeconds <= basicHeaderObj.utc) and (endUTSeconds > basicHeaderObj.utc)):
94 return 0
94 return 0
95
95
96 return 1
96 return 1
97
97
98
98
99 def isTimeInRange(thisTime, startTime, endTime):
99 def isTimeInRange(thisTime, startTime, endTime):
100 if endTime >= startTime:
100 if endTime >= startTime:
101 if (thisTime < startTime) or (thisTime > endTime):
101 if (thisTime < startTime) or (thisTime > endTime):
102 return 0
102 return 0
103 return 1
103 return 1
104 else:
104 else:
105 if (thisTime < startTime) and (thisTime > endTime):
105 if (thisTime < startTime) and (thisTime > endTime):
106 return 0
106 return 0
107 return 1
107 return 1
108
108
109
109
110 def isFileInTimeRange(filename, startDate, endDate, startTime, endTime):
110 def isFileInTimeRange(filename, startDate, endDate, startTime, endTime):
111 """
111 """
112 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
112 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
113
113
114 Inputs:
114 Inputs:
115 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
115 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
116
116
117 startDate : fecha inicial del rango seleccionado en formato datetime.date
117 startDate : fecha inicial del rango seleccionado en formato datetime.date
118
118
119 endDate : fecha final del rango seleccionado en formato datetime.date
119 endDate : fecha final del rango seleccionado en formato datetime.date
120
120
121 startTime : tiempo inicial del rango seleccionado en formato datetime.time
121 startTime : tiempo inicial del rango seleccionado en formato datetime.time
122
122
123 endTime : tiempo final del rango seleccionado en formato datetime.time
123 endTime : tiempo final del rango seleccionado en formato datetime.time
124
124
125 Return:
125 Return:
126 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
126 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
127 fecha especificado, de lo contrario retorna False.
127 fecha especificado, de lo contrario retorna False.
128
128
129 Excepciones:
129 Excepciones:
130 Si el archivo no existe o no puede ser abierto
130 Si el archivo no existe o no puede ser abierto
131 Si la cabecera no puede ser leida.
131 Si la cabecera no puede ser leida.
132
132
133 """
133 """
134
134
135 try:
135 try:
136 fp = open(filename, 'rb')
136 fp = open(filename, 'rb')
137 except IOError:
137 except IOError:
138 print("The file %s can't be opened" % (filename))
138 print("The file %s can't be opened" % (filename))
139 return None
139 return None
140
140
141 firstBasicHeaderObj = BasicHeader(LOCALTIME)
141 firstBasicHeaderObj = BasicHeader(LOCALTIME)
142 systemHeaderObj = SystemHeader()
142 systemHeaderObj = SystemHeader()
143 radarControllerHeaderObj = RadarControllerHeader()
143 radarControllerHeaderObj = RadarControllerHeader()
144 processingHeaderObj = ProcessingHeader()
144 processingHeaderObj = ProcessingHeader()
145
145
146 lastBasicHeaderObj = BasicHeader(LOCALTIME)
146 lastBasicHeaderObj = BasicHeader(LOCALTIME)
147
147
148 sts = firstBasicHeaderObj.read(fp)
148 sts = firstBasicHeaderObj.read(fp)
149
149
150 if not(sts):
150 if not(sts):
151 print("[Reading] Skipping the file %s because it has not a valid header" % (filename))
151 print("[Reading] Skipping the file %s because it has not a valid header" % (filename))
152 return None
152 return None
153
153
154 if not systemHeaderObj.read(fp):
154 if not systemHeaderObj.read(fp):
155 return None
155 return None
156
156
157 if not radarControllerHeaderObj.read(fp):
157 if not radarControllerHeaderObj.read(fp):
158 return None
158 return None
159
159
160 if not processingHeaderObj.read(fp):
160 if not processingHeaderObj.read(fp):
161 return None
161 return None
162
162
163 filesize = os.path.getsize(filename)
163 filesize = os.path.getsize(filename)
164
164
165 offset = processingHeaderObj.blockSize + 24 # header size
165 offset = processingHeaderObj.blockSize + 24 # header size
166
166
167 if filesize <= offset:
167 if filesize <= offset:
168 print("[Reading] %s: This file has not enough data" % filename)
168 print("[Reading] %s: This file has not enough data" % filename)
169 return None
169 return None
170
170
171 fp.seek(-offset, 2)
171 fp.seek(-offset, 2)
172
172
173 sts = lastBasicHeaderObj.read(fp)
173 sts = lastBasicHeaderObj.read(fp)
174
174
175 fp.close()
175 fp.close()
176
176
177 thisDatetime = lastBasicHeaderObj.datatime
177 thisDatetime = lastBasicHeaderObj.datatime
178 thisTime_last_block = thisDatetime.time()
178 thisTime_last_block = thisDatetime.time()
179
179
180 thisDatetime = firstBasicHeaderObj.datatime
180 thisDatetime = firstBasicHeaderObj.datatime
181 thisDate = thisDatetime.date()
181 thisDate = thisDatetime.date()
182 thisTime_first_block = thisDatetime.time()
182 thisTime_first_block = thisDatetime.time()
183
183
184 # General case
184 # General case
185 # o>>>>>>>>>>>>>><<<<<<<<<<<<<<o
185 # o>>>>>>>>>>>>>><<<<<<<<<<<<<<o
186 #-----------o----------------------------o-----------
186 #-----------o----------------------------o-----------
187 # startTime endTime
187 # startTime endTime
188
188
189 if endTime >= startTime:
189 if endTime >= startTime:
190 if (thisTime_last_block < startTime) or (thisTime_first_block > endTime):
190 if (thisTime_last_block < startTime) or (thisTime_first_block > endTime):
191 return None
191 return None
192
192
193 return thisDatetime
193 return thisDatetime
194
194
195 # If endTime < startTime then endTime belongs to the next day
195 # If endTime < startTime then endTime belongs to the next day
196
196
197 #<<<<<<<<<<<o o>>>>>>>>>>>
197 #<<<<<<<<<<<o o>>>>>>>>>>>
198 #-----------o----------------------------o-----------
198 #-----------o----------------------------o-----------
199 # endTime startTime
199 # endTime startTime
200
200
201 if (thisDate == startDate) and (thisTime_last_block < startTime):
201 if (thisDate == startDate) and (thisTime_last_block < startTime):
202 return None
202 return None
203
203
204 if (thisDate == endDate) and (thisTime_first_block > endTime):
204 if (thisDate == endDate) and (thisTime_first_block > endTime):
205 return None
205 return None
206
206
207 if (thisTime_last_block < startTime) and (thisTime_first_block > endTime):
207 if (thisTime_last_block < startTime) and (thisTime_first_block > endTime):
208 return None
208 return None
209
209
210 return thisDatetime
210 return thisDatetime
211
211
212
212
213 def isFolderInDateRange(folder, startDate=None, endDate=None):
213 def isFolderInDateRange(folder, startDate=None, endDate=None):
214 """
214 """
215 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
215 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
216
216
217 Inputs:
217 Inputs:
218 folder : nombre completo del directorio.
218 folder : nombre completo del directorio.
219 Su formato deberia ser "/path_root/?YYYYDDD"
219 Su formato deberia ser "/path_root/?YYYYDDD"
220
220
221 siendo:
221 siendo:
222 YYYY : Anio (ejemplo 2015)
222 YYYY : Anio (ejemplo 2015)
223 DDD : Dia del anio (ejemplo 305)
223 DDD : Dia del anio (ejemplo 305)
224
224
225 startDate : fecha inicial del rango seleccionado en formato datetime.date
225 startDate : fecha inicial del rango seleccionado en formato datetime.date
226
226
227 endDate : fecha final del rango seleccionado en formato datetime.date
227 endDate : fecha final del rango seleccionado en formato datetime.date
228
228
229 Return:
229 Return:
230 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
230 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
231 fecha especificado, de lo contrario retorna False.
231 fecha especificado, de lo contrario retorna False.
232 Excepciones:
232 Excepciones:
233 Si el directorio no tiene el formato adecuado
233 Si el directorio no tiene el formato adecuado
234 """
234 """
235
235
236 basename = os.path.basename(folder)
236 basename = os.path.basename(folder)
237
237
238 if not isRadarFolder(basename):
238 if not isRadarFolder(basename):
239 print("The folder %s has not the rigth format" % folder)
239 print("The folder %s has not the rigth format" % folder)
240 return 0
240 return 0
241
241
242 if startDate and endDate:
242 if startDate and endDate:
243 thisDate = getDateFromRadarFolder(basename)
243 thisDate = getDateFromRadarFolder(basename)
244
244
245 if thisDate < startDate:
245 if thisDate < startDate:
246 return 0
246 return 0
247
247
248 if thisDate > endDate:
248 if thisDate > endDate:
249 return 0
249 return 0
250
250
251 return 1
251 return 1
252
252
253
253
254 def isFileInDateRange(filename, startDate=None, endDate=None):
254 def isFileInDateRange(filename, startDate=None, endDate=None):
255 """
255 """
256 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
256 Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado.
257
257
258 Inputs:
258 Inputs:
259 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
259 filename : nombre completo del archivo de datos en formato Jicamarca (.r)
260
260
261 Su formato deberia ser "?YYYYDDDsss"
261 Su formato deberia ser "?YYYYDDDsss"
262
262
263 siendo:
263 siendo:
264 YYYY : Anio (ejemplo 2015)
264 YYYY : Anio (ejemplo 2015)
265 DDD : Dia del anio (ejemplo 305)
265 DDD : Dia del anio (ejemplo 305)
266 sss : set
266 sss : set
267
267
268 startDate : fecha inicial del rango seleccionado en formato datetime.date
268 startDate : fecha inicial del rango seleccionado en formato datetime.date
269
269
270 endDate : fecha final del rango seleccionado en formato datetime.date
270 endDate : fecha final del rango seleccionado en formato datetime.date
271
271
272 Return:
272 Return:
273 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
273 Boolean : Retorna True si el archivo de datos contiene datos en el rango de
274 fecha especificado, de lo contrario retorna False.
274 fecha especificado, de lo contrario retorna False.
275 Excepciones:
275 Excepciones:
276 Si el archivo no tiene el formato adecuado
276 Si el archivo no tiene el formato adecuado
277 """
277 """
278
278
279 basename = os.path.basename(filename)
279 basename = os.path.basename(filename)
280
280
281 if not isRadarFile(basename):
281 if not isRadarFile(basename):
282 print("The filename %s has not the rigth format" % filename)
282 print("The filename %s has not the rigth format" % filename)
283 return 0
283 return 0
284
284
285 if startDate and endDate:
285 if startDate and endDate:
286 thisDate = getDateFromRadarFile(basename)
286 thisDate = getDateFromRadarFile(basename)
287
287
288 if thisDate < startDate:
288 if thisDate < startDate:
289 return 0
289 return 0
290
290
291 if thisDate > endDate:
291 if thisDate > endDate:
292 return 0
292 return 0
293
293
294 return 1
294 return 1
295
295
296
296
297 def getFileFromSet(path, ext, set):
297 def getFileFromSet(path, ext, set):
298 validFilelist = []
298 validFilelist = []
299 fileList = os.listdir(path)
299 fileList = os.listdir(path)
300
300
301 # 0 1234 567 89A BCDE
301 # 0 1234 567 89A BCDE
302 # H YYYY DDD SSS .ext
302 # H YYYY DDD SSS .ext
303
303
304 for thisFile in fileList:
304 for thisFile in fileList:
305 try:
305 try:
306 year = int(thisFile[1:5])
306 year = int(thisFile[1:5])
307 doy = int(thisFile[5:8])
307 doy = int(thisFile[5:8])
308 except:
308 except:
309 continue
309 continue
310
310
311 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
311 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
312 continue
312 continue
313
313
314 validFilelist.append(thisFile)
314 validFilelist.append(thisFile)
315
315
316 myfile = fnmatch.filter(
316 myfile = fnmatch.filter(
317 validFilelist, '*%4.4d%3.3d%3.3d*' % (year, doy, set))
317 validFilelist, '*%4.4d%3.3d%3.3d*' % (year, doy, set))
318
318
319 if len(myfile) != 0:
319 if len(myfile) != 0:
320 return myfile[0]
320 return myfile[0]
321 else:
321 else:
322 filename = '*%4.4d%3.3d%3.3d%s' % (year, doy, set, ext.lower())
322 filename = '*%4.4d%3.3d%3.3d%s' % (year, doy, set, ext.lower())
323 print('the filename %s does not exist' % filename)
323 print('the filename %s does not exist' % filename)
324 print('...going to the last file: ')
324 print('...going to the last file: ')
325
325
326 if validFilelist:
326 if validFilelist:
327 validFilelist = sorted(validFilelist, key=str.lower)
327 validFilelist = sorted(validFilelist, key=str.lower)
328 return validFilelist[-1]
328 return validFilelist[-1]
329
329
330 return None
330 return None
331
331
332
332
333 def getlastFileFromPath(path, ext):
333 def getlastFileFromPath(path, ext):
334 """
334 """
335 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
335 Depura el fileList dejando solo los que cumplan el formato de "PYYYYDDDSSS.ext"
336 al final de la depuracion devuelve el ultimo file de la lista que quedo.
336 al final de la depuracion devuelve el ultimo file de la lista que quedo.
337
337
338 Input:
338 Input:
339 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
339 fileList : lista conteniendo todos los files (sin path) que componen una determinada carpeta
340 ext : extension de los files contenidos en una carpeta
340 ext : extension de los files contenidos en una carpeta
341
341
342 Return:
342 Return:
343 El ultimo file de una determinada carpeta, no se considera el path.
343 El ultimo file de una determinada carpeta, no se considera el path.
344 """
344 """
345 validFilelist = []
345 validFilelist = []
346 fileList = os.listdir(path)
346 fileList = os.listdir(path)
347
347
348 # 0 1234 567 89A BCDE
348 # 0 1234 567 89A BCDE
349 # H YYYY DDD SSS .ext
349 # H YYYY DDD SSS .ext
350
350
351 for thisFile in fileList:
351 for thisFile in fileList:
352
352
353 year = thisFile[1:5]
353 year = thisFile[1:5]
354 if not isNumber(year):
354 if not isNumber(year):
355 continue
355 continue
356
356
357 doy = thisFile[5:8]
357 doy = thisFile[5:8]
358 if not isNumber(doy):
358 if not isNumber(doy):
359 continue
359 continue
360
360
361 year = int(year)
361 year = int(year)
362 doy = int(doy)
362 doy = int(doy)
363
363
364 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
364 if (os.path.splitext(thisFile)[-1].lower() != ext.lower()):
365 continue
365 continue
366
366
367 validFilelist.append(thisFile)
367 validFilelist.append(thisFile)
368
368
369 if validFilelist:
369 if validFilelist:
370 validFilelist = sorted(validFilelist, key=str.lower)
370 validFilelist = sorted(validFilelist, key=str.lower)
371 return validFilelist[-1]
371 return validFilelist[-1]
372
372
373 return None
373 return None
374
374
375
375
376 def isRadarFolder(folder):
376 def isRadarFolder(folder):
377 try:
377 try:
378 year = int(folder[1:5])
378 year = int(folder[1:5])
379 doy = int(folder[5:8])
379 doy = int(folder[5:8])
380 except:
380 except:
381 return 0
381 return 0
382
382
383 return 1
383 return 1
384
384
385
385
386 def isRadarFile(file):
386 def isRadarFile(file):
387 try:
387 try:
388 year = int(file[1:5])
388 year = int(file[1:5])
389 doy = int(file[5:8])
389 doy = int(file[5:8])
390 set = int(file[8:11])
390 set = int(file[8:11])
391 except:
391 except:
392 return 0
392 return 0
393
393
394 return 1
394 return 1
395
395
396
396
397 def getDateFromRadarFile(file):
397 def getDateFromRadarFile(file):
398 try:
398 try:
399 year = int(file[1:5])
399 year = int(file[1:5])
400 doy = int(file[5:8])
400 doy = int(file[5:8])
401 set = int(file[8:11])
401 set = int(file[8:11])
402 except:
402 except:
403 return None
403 return None
404
404
405 thisDate = datetime.date(year, 1, 1) + datetime.timedelta(doy - 1)
405 thisDate = datetime.date(year, 1, 1) + datetime.timedelta(doy - 1)
406 return thisDate
406 return thisDate
407
407
408
408
409 def getDateFromRadarFolder(folder):
409 def getDateFromRadarFolder(folder):
410 try:
410 try:
411 year = int(folder[1:5])
411 year = int(folder[1:5])
412 doy = int(folder[5:8])
412 doy = int(folder[5:8])
413 except:
413 except:
414 return None
414 return None
415
415
416 thisDate = datetime.date(year, 1, 1) + datetime.timedelta(doy - 1)
416 thisDate = datetime.date(year, 1, 1) + datetime.timedelta(doy - 1)
417 return thisDate
417 return thisDate
418
418
419 def parse_format(s, fmt):
419 def parse_format(s, fmt):
420
420
421 for i in range(fmt.count('%')):
421 for i in range(fmt.count('%')):
422 x = fmt.index('%')
422 x = fmt.index('%')
423 d = DT_DIRECTIVES[fmt[x:x+2]]
423 d = DT_DIRECTIVES[fmt[x:x+2]]
424 fmt = fmt.replace(fmt[x:x+2], s[x:x+d])
424 fmt = fmt.replace(fmt[x:x+2], s[x:x+d])
425 return fmt
425 return fmt
426
426
427 class Reader(object):
427 class Reader(object):
428
428
429 c = 3E8
429 c = 3E8
430 isConfig = False
430 isConfig = False
431 dtype = None
431 dtype = None
432 pathList = []
432 pathList = []
433 filenameList = []
433 filenameList = []
434 datetimeList = []
434 datetimeList = []
435 filename = None
435 filename = None
436 ext = None
436 ext = None
437 flagIsNewFile = 1
437 flagIsNewFile = 1
438 flagDiscontinuousBlock = 0
438 flagDiscontinuousBlock = 0
439 flagIsNewBlock = 0
439 flagIsNewBlock = 0
440 flagNoMoreFiles = 0
440 flagNoMoreFiles = 0
441 fp = None
441 fp = None
442 firstHeaderSize = 0
442 firstHeaderSize = 0
443 basicHeaderSize = 24
443 basicHeaderSize = 24
444 versionFile = 1103
444 versionFile = 1103
445 fileSize = None
445 fileSize = None
446 fileSizeByHeader = None
446 fileSizeByHeader = None
447 fileIndex = -1
447 fileIndex = -1
448 profileIndex = None
448 profileIndex = None
449 blockIndex = 0
449 blockIndex = 0
450 nTotalBlocks = 0
450 nTotalBlocks = 0
451 maxTimeStep = 30
451 maxTimeStep = 30
452 lastUTTime = None
452 lastUTTime = None
453 datablock = None
453 datablock = None
454 dataOut = None
454 dataOut = None
455 getByBlock = False
455 getByBlock = False
456 path = None
456 path = None
457 startDate = None
457 startDate = None
458 endDate = None
458 endDate = None
459 startTime = datetime.time(0, 0, 0)
459 startTime = datetime.time(0, 0, 0)
460 endTime = datetime.time(23, 59, 59)
460 endTime = datetime.time(23, 59, 59)
461 set = None
461 set = None
462 expLabel = ""
462 expLabel = ""
463 online = False
463 online = False
464 delay = 60
464 delay = 60
465 nTries = 3 # quantity tries
465 nTries = 3 # quantity tries
466 nFiles = 3 # number of files for searching
466 nFiles = 3 # number of files for searching
467 walk = True
467 walk = True
468 getblock = False
468 getblock = False
469 nTxs = 1
469 nTxs = 1
470 realtime = False
470 realtime = False
471 blocksize = 0
471 blocksize = 0
472 blocktime = None
472 blocktime = None
473 warnings = True
473 warnings = True
474 verbose = True
474 verbose = True
475 server = None
475 server = None
476 format = None
476 format = None
477 oneDDict = None
477 oneDDict = None
478 twoDDict = None
478 twoDDict = None
479 independentParam = None
479 independentParam = None
480 filefmt = None
480 filefmt = None
481 folderfmt = None
481 folderfmt = None
482 open_file = open
482 open_file = open
483 open_mode = 'rb'
483 open_mode = 'rb'
484
484
485 def run(self):
485 def run(self):
486
486
487 raise NotImplementedError
487 raise NotImplementedError
488
488
489 def getAllowedArgs(self):
489 def getAllowedArgs(self):
490 if hasattr(self, '__attrs__'):
490 if hasattr(self, '__attrs__'):
491 return self.__attrs__
491 return self.__attrs__
492 else:
492 else:
493 return inspect.getargspec(self.run).args
493 return inspect.getargspec(self.run).args
494
494
495 def set_kwargs(self, **kwargs):
495 def set_kwargs(self, **kwargs):
496
496
497 for key, value in kwargs.items():
497 for key, value in kwargs.items():
498 setattr(self, key, value)
498 setattr(self, key, value)
499
499
500 def find_folders(self, path, startDate, endDate, folderfmt, last=False):
500 def find_folders(self, path, startDate, endDate, folderfmt, last=False):
501
501
502 folders = [x for f in path.split(',')
502 folders = [x for f in path.split(',')
503 for x in os.listdir(f) if os.path.isdir(os.path.join(f, x))]
503 for x in os.listdir(f) if os.path.isdir(os.path.join(f, x))]
504 folders.sort()
504 folders.sort()
505
505
506 if last:
506 if last:
507 folders = [folders[-1]]
507 folders = [folders[-1]]
508
508
509 for folder in folders:
509 for folder in folders:
510 try:
510 try:
511 dt = datetime.datetime.strptime(parse_format(folder, folderfmt), folderfmt).date()
511 dt = datetime.datetime.strptime(parse_format(folder, folderfmt), folderfmt).date()
512 if dt >= startDate and dt <= endDate:
512 if dt >= startDate and dt <= endDate:
513 yield os.path.join(path, folder)
513 yield os.path.join(path, folder)
514 else:
514 else:
515 log.log('Skiping folder {}'.format(folder), self.name)
515 log.log('Skiping folder {}'.format(folder), self.name)
516 except Exception as e:
516 except Exception as e:
517 log.log('Skiping folder {}'.format(folder), self.name)
517 log.log('Skiping folder {}'.format(folder), self.name)
518 continue
518 continue
519 return
519 return
520
520
521 def find_files(self, folders, ext, filefmt, startDate=None, endDate=None,
521 def find_files(self, folders, ext, filefmt, startDate=None, endDate=None,
522 expLabel='', last=False):
522 expLabel='', last=False):
523
523
524 for path in folders:
524 for path in folders:
525 files = glob.glob1(path, '*{}'.format(ext))
525 files = glob.glob1(path, '*{}'.format(ext))
526 files.sort()
526 files.sort()
527 if last:
527 if last:
528 if files:
528 if files:
529 fo = files[-1]
529 fo = files[-1]
530 try:
530 try:
531 dt = datetime.datetime.strptime(parse_format(fo, filefmt), filefmt).date()
531 dt = datetime.datetime.strptime(parse_format(fo, filefmt), filefmt).date()
532 yield os.path.join(path, expLabel, fo)
532 yield os.path.join(path, expLabel, fo)
533 except Exception as e:
533 except Exception as e:
534 pass
534 pass
535 return
535 return
536 else:
536 else:
537 return
537 return
538
538
539 for fo in files:
539 for fo in files:
540 try:
540 try:
541 dt = datetime.datetime.strptime(parse_format(fo, filefmt), filefmt).date()
541 dt = datetime.datetime.strptime(parse_format(fo, filefmt), filefmt).date()
542 if dt >= startDate and dt <= endDate:
542 if dt >= startDate and dt <= endDate:
543 yield os.path.join(path, expLabel, fo)
543 yield os.path.join(path, expLabel, fo)
544 else:
544 else:
545 log.log('Skiping file {}'.format(fo), self.name)
545 log.log('Skiping file {}'.format(fo), self.name)
546 except Exception as e:
546 except Exception as e:
547 log.log('Skiping file {}'.format(fo), self.name)
547 log.log('Skiping file {}'.format(fo), self.name)
548 continue
548 continue
549
549
550 def searchFilesOffLine(self, path, startDate, endDate,
550 def searchFilesOffLine(self, path, startDate, endDate,
551 expLabel, ext, walk,
551 expLabel, ext, walk,
552 filefmt, folderfmt):
552 filefmt, folderfmt):
553 """Search files in offline mode for the given arguments
553 """Search files in offline mode for the given arguments
554
554
555 Return:
555 Return:
556 Generator of files
556 Generator of files
557 """
557 """
558
558
559 if walk:
559 if walk:
560 folders = self.find_folders(
560 folders = self.find_folders(
561 path, startDate, endDate, folderfmt)
561 path, startDate, endDate, folderfmt)
562 else:
562 else:
563 folders = path.split(',')
563 folders = path.split(',')
564
564
565 return self.find_files(
565 return self.find_files(
566 folders, ext, filefmt, startDate, endDate, expLabel)
566 folders, ext, filefmt, startDate, endDate, expLabel)
567
567
568 def searchFilesOnLine(self, path, startDate, endDate,
568 def searchFilesOnLine(self, path, startDate, endDate,
569 expLabel, ext, walk,
569 expLabel, ext, walk,
570 filefmt, folderfmt):
570 filefmt, folderfmt):
571 """Search for the last file of the last folder
571 """Search for the last file of the last folder
572
572
573 Arguments:
573 Arguments:
574 path : carpeta donde estan contenidos los files que contiene data
574 path : carpeta donde estan contenidos los files que contiene data
575 expLabel : Nombre del subexperimento (subfolder)
575 expLabel : Nombre del subexperimento (subfolder)
576 ext : extension de los files
576 ext : extension de los files
577 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
577 walk : Si es habilitado no realiza busquedas dentro de los ubdirectorios (doypath)
578
578
579 Return:
579 Return:
580 generator with the full path of last filename
580 generator with the full path of last filename
581 """
581 """
582
582
583 if walk:
583 if walk:
584 folders = self.find_folders(
584 folders = self.find_folders(
585 path, startDate, endDate, folderfmt, last=True)
585 path, startDate, endDate, folderfmt, last=True)
586 else:
586 else:
587 folders = path.split(',')
587 folders = path.split(',')
588
588
589 return self.find_files(
589 return self.find_files(
590 folders, ext, filefmt, startDate, endDate, expLabel, last=True)
590 folders, ext, filefmt, startDate, endDate, expLabel, last=True)
591
591
592 def setNextFile(self):
592 def setNextFile(self):
593 """Set the next file to be readed open it and parse de file header"""
593 """Set the next file to be readed open it and parse de file header"""
594
594
595 while True:
595 while True:
596 if self.fp != None:
596 if self.fp != None:
597 self.fp.close()
597 self.fp.close()
598
598
599 if self.online:
599 if self.online:
600 newFile = self.setNextFileOnline()
600 newFile = self.setNextFileOnline()
601 else:
601 else:
602 newFile = self.setNextFileOffline()
602 newFile = self.setNextFileOffline()
603
603
604 if not(newFile):
604 if not(newFile):
605 if self.online:
605 if self.online:
606 raise schainpy.admin.SchainError('Time to wait for new files reach')
606 raise schainpy.admin.SchainError('Time to wait for new files reach')
607 else:
607 else:
608 if self.fileIndex == -1:
608 if self.fileIndex == -1:
609 raise schainpy.admin.SchainWarning('No files found in the given path')
609 raise schainpy.admin.SchainWarning('No files found in the given path')
610 else:
610 else:
611 raise schainpy.admin.SchainWarning('No more files to read')
611 raise schainpy.admin.SchainWarning('No more files to read')
612
612
613 if self.verifyFile(self.filename):
613 if self.verifyFile(self.filename):
614 break
614 break
615
615
616 log.log('Opening file: %s' % self.filename, self.name)
616 log.log('Opening file: %s' % self.filename, self.name)
617
617
618 self.readFirstHeader()
618 self.readFirstHeader()
619 self.nReadBlocks = 0
619 self.nReadBlocks = 0
620
620
621 def setNextFileOnline(self):
621 def setNextFileOnline(self):
622 """Check for the next file to be readed in online mode.
622 """Check for the next file to be readed in online mode.
623
623
624 Set:
624 Set:
625 self.filename
625 self.filename
626 self.fp
626 self.fp
627 self.filesize
627 self.filesize
628
628
629 Return:
629 Return:
630 boolean
630 boolean
631
631
632 """
632 """
633 nextFile = True
633 nextFile = True
634 nextDay = False
634 nextDay = False
635
635
636 for nFiles in range(self.nFiles+1):
636 for nFiles in range(self.nFiles+1):
637 for nTries in range(self.nTries):
637 for nTries in range(self.nTries):
638 fullfilename, filename = self.checkForRealPath(nextFile, nextDay)
638 fullfilename, filename = self.checkForRealPath(nextFile, nextDay)
639 if fullfilename is not None:
639 if fullfilename is not None:
640 break
640 break
641 log.warning(
641 log.warning(
642 "Waiting %0.2f sec for the next file: \"%s\" , try %02d ..." % (self.delay, filename, nTries + 1),
642 "Waiting %0.2f sec for the next file: \"%s\" , try %02d ..." % (self.delay, filename, nTries + 1),
643 self.name)
643 self.name)
644 time.sleep(self.delay)
644 time.sleep(self.delay)
645 nextFile = False
645 nextFile = False
646 continue
646 continue
647
647
648 if fullfilename is not None:
648 if fullfilename is not None:
649 break
649 break
650
650
651 self.nTries = 1
651 self.nTries = 1
652 nextFile = True
652 nextFile = True
653
653
654 if nFiles == (self.nFiles - 1):
654 if nFiles == (self.nFiles - 1):
655 log.log('Trying with next day...', self.name)
655 log.log('Trying with next day...', self.name)
656 nextDay = True
656 nextDay = True
657 self.nTries = 3
657 self.nTries = 3
658
658
659 if fullfilename:
659 if fullfilename:
660 self.fileSize = os.path.getsize(fullfilename)
660 self.fileSize = os.path.getsize(fullfilename)
661 self.filename = fullfilename
661 self.filename = fullfilename
662 self.flagIsNewFile = 1
662 self.flagIsNewFile = 1
663 if self.fp != None:
663 if self.fp != None:
664 self.fp.close()
664 self.fp.close()
665 self.fp = self.open_file(fullfilename, self.open_mode)
665 self.fp = self.open_file(fullfilename, self.open_mode)
666 self.flagNoMoreFiles = 0
666 self.flagNoMoreFiles = 0
667 self.fileIndex += 1
667 self.fileIndex += 1
668 return 1
668 return 1
669 else:
669 else:
670 return 0
670 return 0
671
671
672 def setNextFileOffline(self):
672 def setNextFileOffline(self):
673 """Open the next file to be readed in offline mode"""
673 """Open the next file to be readed in offline mode"""
674
674
675 try:
675 try:
676 filename = next(self.filenameList)
676 filename = next(self.filenameList)
677 self.fileIndex +=1
677 self.fileIndex +=1
678 except StopIteration:
678 except StopIteration:
679 self.flagNoMoreFiles = 1
679 self.flagNoMoreFiles = 1
680 return 0
680 return 0
681
681
682 self.filename = filename
682 self.filename = filename
683 self.fileSize = os.path.getsize(filename)
683 self.fileSize = os.path.getsize(filename)
684 self.fp = self.open_file(filename, self.open_mode)
684 self.fp = self.open_file(filename, self.open_mode)
685 self.flagIsNewFile = 1
685 self.flagIsNewFile = 1
686
686
687 return 1
687 return 1
688
688
689 @staticmethod
689 @staticmethod
690 def isDateTimeInRange(dt, startDate, endDate, startTime, endTime):
690 def isDateTimeInRange(dt, startDate, endDate, startTime, endTime):
691 """Check if the given datetime is in range"""
691 """Check if the given datetime is in range"""
692 startDateTime= datetime.datetime.combine(startDate,startTime)
692 startDateTime= datetime.datetime.combine(startDate,startTime)
693 endDateTime = datetime.datetime.combine(endDate,endTime)
693 endDateTime = datetime.datetime.combine(endDate,endTime)
694 if startDateTime <= dt <= endDateTime:
694 if startDateTime <= dt <= endDateTime:
695 return True
695 return True
696 return False
696 return False
697
697
698 def verifyFile(self, filename):
698 def verifyFile(self, filename):
699 """Check for a valid file
699 """Check for a valid file
700
700
701 Arguments:
701 Arguments:
702 filename -- full path filename
702 filename -- full path filename
703
703
704 Return:
704 Return:
705 boolean
705 boolean
706 """
706 """
707
707
708 return True
708 return True
709
709
710 def checkForRealPath(self, nextFile, nextDay):
710 def checkForRealPath(self, nextFile, nextDay):
711 """Check if the next file to be readed exists"""
711 """Check if the next file to be readed exists"""
712
712
713 raise NotImplementedError
713 raise NotImplementedError
714
714
715 def readFirstHeader(self):
715 def readFirstHeader(self):
716 """Parse the file header"""
716 """Parse the file header"""
717
717
718 pass
718 pass
719
719
720 def waitDataBlock(self, pointer_location, blocksize=None):
720 def waitDataBlock(self, pointer_location, blocksize=None):
721 """
721 """
722 """
722 """
723
723
724 currentPointer = pointer_location
724 currentPointer = pointer_location
725 if blocksize is None:
725 if blocksize is None:
726 neededSize = self.processingHeaderObj.blockSize # + self.basicHeaderSize
726 neededSize = self.processingHeaderObj.blockSize # + self.basicHeaderSize
727 else:
727 else:
728 neededSize = blocksize
728 neededSize = blocksize
729
729
730 for nTries in range(self.nTries):
730 for nTries in range(self.nTries):
731 self.fp.close()
731 self.fp.close()
732 self.fp = open(self.filename, 'rb')
732 self.fp = open(self.filename, 'rb')
733 self.fp.seek(currentPointer)
733 self.fp.seek(currentPointer)
734
734
735 self.fileSize = os.path.getsize(self.filename)
735 self.fileSize = os.path.getsize(self.filename)
736 currentSize = self.fileSize - currentPointer
736 currentSize = self.fileSize - currentPointer
737
737
738 if (currentSize >= neededSize):
738 if (currentSize >= neededSize):
739 return 1
739 return 1
740
740
741 log.warning(
741 log.warning(
742 "Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries + 1),
742 "Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries + 1),
743 self.name
743 self.name
744 )
744 )
745 time.sleep(self.delay)
745 time.sleep(self.delay)
746
746
747 return 0
747 return 0
748
748
749 class JRODataReader(Reader):
749 class JRODataReader(Reader):
750
750
751 utc = 0
751 utc = 0
752 nReadBlocks = 0
752 nReadBlocks = 0
753 foldercounter = 0
753 foldercounter = 0
754 firstHeaderSize = 0
754 firstHeaderSize = 0
755 basicHeaderSize = 24
755 basicHeaderSize = 24
756 __isFirstTimeOnline = 1
756 __isFirstTimeOnline = 1
757 filefmt = "*%Y%j***"
757 filefmt = "*%Y%j***"
758 folderfmt = "*%Y%j"
758 folderfmt = "*%Y%j"
759 __attrs__ = ['path', 'startDate', 'endDate', 'startTime', 'endTime', 'online', 'delay', 'walk']
759 __attrs__ = ['path', 'startDate', 'endDate', 'startTime', 'endTime', 'online', 'delay', 'walk']
760
760
761 def getDtypeWidth(self):
761 def getDtypeWidth(self):
762
762
763 dtype_index = get_dtype_index(self.dtype)
763 dtype_index = get_dtype_index(self.dtype)
764 dtype_width = get_dtype_width(dtype_index)
764 dtype_width = get_dtype_width(dtype_index)
765
765
766 return dtype_width
766 return dtype_width
767
767
768 def checkForRealPath(self, nextFile, nextDay):
768 def checkForRealPath(self, nextFile, nextDay):
769 """Check if the next file to be readed exists.
769 """Check if the next file to be readed exists.
770
770
771 Example :
771 Example :
772 nombre correcto del file es .../.../D2009307/P2009307367.ext
772 nombre correcto del file es .../.../D2009307/P2009307367.ext
773
773
774 Entonces la funcion prueba con las siguientes combinaciones
774 Entonces la funcion prueba con las siguientes combinaciones
775 .../.../y2009307367.ext
775 .../.../y2009307367.ext
776 .../.../Y2009307367.ext
776 .../.../Y2009307367.ext
777 .../.../x2009307/y2009307367.ext
777 .../.../x2009307/y2009307367.ext
778 .../.../x2009307/Y2009307367.ext
778 .../.../x2009307/Y2009307367.ext
779 .../.../X2009307/y2009307367.ext
779 .../.../X2009307/y2009307367.ext
780 .../.../X2009307/Y2009307367.ext
780 .../.../X2009307/Y2009307367.ext
781 siendo para este caso, la ultima combinacion de letras, identica al file buscado
781 siendo para este caso, la ultima combinacion de letras, identica al file buscado
782
782
783 Return:
783 Return:
784 str -- fullpath of the file
784 str -- fullpath of the file
785 """
785 """
786
786
787
787
788 if nextFile:
788 if nextFile:
789 self.set += 1
789 self.set += 1
790 if nextDay:
790 if nextDay:
791 self.set = 0
791 self.set = 0
792 self.doy += 1
792 self.doy += 1
793 foldercounter = 0
793 foldercounter = 0
794 prefixDirList = [None, 'd', 'D']
794 prefixDirList = [None, 'd', 'D']
795 if self.ext.lower() == ".r": # voltage
795 if self.ext.lower() == ".r": # voltage
796 prefixFileList = ['d', 'D']
796 prefixFileList = ['d', 'D']
797 elif self.ext.lower() == ".pdata": # spectra
797 elif self.ext.lower() == ".pdata": # spectra
798 prefixFileList = ['p', 'P']
798 prefixFileList = ['p', 'P']
799
799
800 # barrido por las combinaciones posibles
800 # barrido por las combinaciones posibles
801 for prefixDir in prefixDirList:
801 for prefixDir in prefixDirList:
802 thispath = self.path
802 thispath = self.path
803 if prefixDir != None:
803 if prefixDir != None:
804 # formo el nombre del directorio xYYYYDDD (x=d o x=D)
804 # formo el nombre del directorio xYYYYDDD (x=d o x=D)
805 if foldercounter == 0:
805 if foldercounter == 0:
806 thispath = os.path.join(self.path, "%s%04d%03d" %
806 thispath = os.path.join(self.path, "%s%04d%03d" %
807 (prefixDir, self.year, self.doy))
807 (prefixDir, self.year, self.doy))
808 else:
808 else:
809 thispath = os.path.join(self.path, "%s%04d%03d_%02d" % (
809 thispath = os.path.join(self.path, "%s%04d%03d_%02d" % (
810 prefixDir, self.year, self.doy, foldercounter))
810 prefixDir, self.year, self.doy, foldercounter))
811 for prefixFile in prefixFileList: # barrido por las dos combinaciones posibles de "D"
811 for prefixFile in prefixFileList: # barrido por las dos combinaciones posibles de "D"
812 # formo el nombre del file xYYYYDDDSSS.ext
812 # formo el nombre del file xYYYYDDDSSS.ext
813 filename = "%s%04d%03d%03d%s" % (prefixFile, self.year, self.doy, self.set, self.ext)
813 filename = "%s%04d%03d%03d%s" % (prefixFile, self.year, self.doy, self.set, self.ext)
814 fullfilename = os.path.join(
814 fullfilename = os.path.join(
815 thispath, filename)
815 thispath, filename)
816
816
817 if os.path.exists(fullfilename):
817 if os.path.exists(fullfilename):
818 return fullfilename, filename
818 return fullfilename, filename
819
819
820 return None, filename
820 return None, filename
821
821
822 def __waitNewBlock(self):
822 def __waitNewBlock(self):
823 """
823 """
824 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
824 Return 1 si se encontro un nuevo bloque de datos, 0 de otra forma.
825
825
826 Si el modo de lectura es OffLine siempre retorn 0
826 Si el modo de lectura es OffLine siempre retorn 0
827 """
827 """
828 if not self.online:
828 if not self.online:
829 return 0
829 return 0
830
830
831 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
831 if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
832 return 0
832 return 0
833
833
834 currentPointer = self.fp.tell()
834 currentPointer = self.fp.tell()
835
835
836 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
836 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
837
837
838 for nTries in range(self.nTries):
838 for nTries in range(self.nTries):
839
839
840 self.fp.close()
840 self.fp.close()
841 self.fp = open(self.filename, 'rb')
841 self.fp = open(self.filename, 'rb')
842 self.fp.seek(currentPointer)
842 self.fp.seek(currentPointer)
843
843
844 self.fileSize = os.path.getsize(self.filename)
844 self.fileSize = os.path.getsize(self.filename)
845 currentSize = self.fileSize - currentPointer
845 currentSize = self.fileSize - currentPointer
846
846
847 if (currentSize >= neededSize):
847 if (currentSize >= neededSize):
848 self.basicHeaderObj.read(self.fp)
848 self.basicHeaderObj.read(self.fp)
849 return 1
849 return 1
850
850
851 if self.fileSize == self.fileSizeByHeader:
851 if self.fileSize == self.fileSizeByHeader:
852 # self.flagEoF = True
852 # self.flagEoF = True
853 return 0
853 return 0
854
854
855 print("[Reading] Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries + 1))
855 print("[Reading] Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries + 1))
856 time.sleep(self.delay)
856 time.sleep(self.delay)
857
857
858 return 0
858 return 0
859
859
860 def __setNewBlock(self):
860 def __setNewBlock(self):
861
861
862 if self.fp == None:
862 if self.fp == None:
863 return 0
863 return 0
864
864
865 if self.flagIsNewFile:
865 if self.flagIsNewFile:
866 self.lastUTTime = self.basicHeaderObj.utc
866 self.lastUTTime = self.basicHeaderObj.utc
867 return 1
867 return 1
868
868
869 if self.realtime:
869 if self.realtime:
870 self.flagDiscontinuousBlock = 1
870 self.flagDiscontinuousBlock = 1
871 if not(self.setNextFile()):
871 if not(self.setNextFile()):
872 return 0
872 return 0
873 else:
873 else:
874 return 1
874 return 1
875
875
876 currentSize = self.fileSize - self.fp.tell()
876 currentSize = self.fileSize - self.fp.tell()
877 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
877 neededSize = self.processingHeaderObj.blockSize + self.basicHeaderSize
878
878
879 if (currentSize >= neededSize):
879 if (currentSize >= neededSize):
880 self.basicHeaderObj.read(self.fp)
880 self.basicHeaderObj.read(self.fp)
881 self.lastUTTime = self.basicHeaderObj.utc
881 self.lastUTTime = self.basicHeaderObj.utc
882 return 1
882 return 1
883
883
884 if self.__waitNewBlock():
884 if self.__waitNewBlock():
885 self.lastUTTime = self.basicHeaderObj.utc
885 self.lastUTTime = self.basicHeaderObj.utc
886 return 1
886 return 1
887
887
888 if not(self.setNextFile()):
888 if not(self.setNextFile()):
889 return 0
889 return 0
890
890
891 deltaTime = self.basicHeaderObj.utc - self.lastUTTime
891 deltaTime = self.basicHeaderObj.utc - self.lastUTTime
892 self.lastUTTime = self.basicHeaderObj.utc
892 self.lastUTTime = self.basicHeaderObj.utc
893
893
894 self.flagDiscontinuousBlock = 0
894 self.flagDiscontinuousBlock = 0
895
895
896 if deltaTime > self.maxTimeStep:
896 if deltaTime > self.maxTimeStep:
897 self.flagDiscontinuousBlock = 1
897 self.flagDiscontinuousBlock = 1
898
898
899 return 1
899 return 1
900
900
901 def readNextBlock(self):
901 def readNextBlock(self):
902
902
903 while True:
903 while True:
904 if not(self.__setNewBlock()):
904 if not(self.__setNewBlock()):
905 continue
905 continue
906
906
907 if not(self.readBlock()):
907 if not(self.readBlock()):
908 return 0
908 return 0
909
909
910 self.getBasicHeader()
910 self.getBasicHeader()
911
911
912 if not self.isDateTimeInRange(self.dataOut.datatime, self.startDate, self.endDate, self.startTime, self.endTime):
912 if not self.isDateTimeInRange(self.dataOut.datatime, self.startDate, self.endDate, self.startTime, self.endTime):
913 print("[Reading] Block No. %d/%d -> %s [Skipping]" % (self.nReadBlocks,
913 print("[Reading] Block No. %d/%d -> %s [Skipping]" % (self.nReadBlocks,
914 self.processingHeaderObj.dataBlocksPerFile,
914 self.processingHeaderObj.dataBlocksPerFile,
915 self.dataOut.datatime.ctime()))
915 self.dataOut.datatime.ctime()))
916 continue
916 continue
917
917
918 break
918 break
919
919
920 if self.verbose:
920 if self.verbose:
921 print("[Reading] Block No. %d/%d -> %s" % (self.nReadBlocks,
921 print("[Reading] Block No. %d/%d -> %s" % (self.nReadBlocks,
922 self.processingHeaderObj.dataBlocksPerFile,
922 self.processingHeaderObj.dataBlocksPerFile,
923 self.dataOut.datatime.ctime()))
923 self.dataOut.datatime.ctime()))
924 return 1
924 return 1
925
925
926 def readFirstHeader(self):
926 def readFirstHeader(self):
927
927
928 self.basicHeaderObj.read(self.fp)
928 self.basicHeaderObj.read(self.fp)
929 self.systemHeaderObj.read(self.fp)
929 self.systemHeaderObj.read(self.fp)
930 self.radarControllerHeaderObj.read(self.fp)
930 self.radarControllerHeaderObj.read(self.fp)
931 self.processingHeaderObj.read(self.fp)
931 self.processingHeaderObj.read(self.fp)
932 self.firstHeaderSize = self.basicHeaderObj.size
932 self.firstHeaderSize = self.basicHeaderObj.size
933
933
934 datatype = int(numpy.log2((self.processingHeaderObj.processFlags &
934 datatype = int(numpy.log2((self.processingHeaderObj.processFlags &
935 PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR))
935 PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR))
936 if datatype == 0:
936 if datatype == 0:
937 datatype_str = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
937 datatype_str = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
938 elif datatype == 1:
938 elif datatype == 1:
939 datatype_str = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
939 datatype_str = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
940 elif datatype == 2:
940 elif datatype == 2:
941 datatype_str = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
941 datatype_str = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
942 elif datatype == 3:
942 elif datatype == 3:
943 datatype_str = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
943 datatype_str = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
944 elif datatype == 4:
944 elif datatype == 4:
945 datatype_str = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
945 datatype_str = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
946 elif datatype == 5:
946 elif datatype == 5:
947 datatype_str = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
947 datatype_str = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
948 else:
948 else:
949 raise ValueError('Data type was not defined')
949 raise ValueError('Data type was not defined')
950
950
951 self.dtype = datatype_str
951 self.dtype = datatype_str
952 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
952 #self.ippSeconds = 2 * 1000 * self.radarControllerHeaderObj.ipp / self.c
953 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + \
953 self.fileSizeByHeader = self.processingHeaderObj.dataBlocksPerFile * self.processingHeaderObj.blockSize + \
954 self.firstHeaderSize + self.basicHeaderSize * \
954 self.firstHeaderSize + self.basicHeaderSize * \
955 (self.processingHeaderObj.dataBlocksPerFile - 1)
955 (self.processingHeaderObj.dataBlocksPerFile - 1)
956 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
956 # self.dataOut.channelList = numpy.arange(self.systemHeaderObj.numChannels)
957 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
957 # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels)
958 self.getBlockDimension()
958 self.getBlockDimension()
959
959
960 def verifyFile(self, filename):
960 def verifyFile(self, filename):
961
961
962 flag = True
962 flag = True
963
963
964 try:
964 try:
965 fp = open(filename, 'rb')
965 fp = open(filename, 'rb')
966 except IOError:
966 except IOError:
967 log.error("File {} can't be opened".format(filename), self.name)
967 log.error("File {} can't be opened".format(filename), self.name)
968 return False
968 return False
969
969
970 if self.online and self.waitDataBlock(0):
970 if self.online and self.waitDataBlock(0):
971 pass
971 pass
972
972
973 basicHeaderObj = BasicHeader(LOCALTIME)
973 basicHeaderObj = BasicHeader(LOCALTIME)
974 systemHeaderObj = SystemHeader()
974 systemHeaderObj = SystemHeader()
975 radarControllerHeaderObj = RadarControllerHeader()
975 radarControllerHeaderObj = RadarControllerHeader()
976 processingHeaderObj = ProcessingHeader()
976 processingHeaderObj = ProcessingHeader()
977
977
978 if not(basicHeaderObj.read(fp)):
978 if not(basicHeaderObj.read(fp)):
979 flag = False
979 flag = False
980 if not(systemHeaderObj.read(fp)):
980 if not(systemHeaderObj.read(fp)):
981 flag = False
981 flag = False
982 if not(radarControllerHeaderObj.read(fp)):
982 if not(radarControllerHeaderObj.read(fp)):
983 flag = False
983 flag = False
984 if not(processingHeaderObj.read(fp)):
984 if not(processingHeaderObj.read(fp)):
985 flag = False
985 flag = False
986 if not self.online:
986 if not self.online:
987 dt1 = basicHeaderObj.datatime
987 dt1 = basicHeaderObj.datatime
988 pos = self.fileSize-processingHeaderObj.blockSize-24
988 pos = self.fileSize-processingHeaderObj.blockSize-24
989 if pos<0:
989 if pos<0:
990 flag = False
990 flag = False
991 log.error('Invalid size for file: {}'.format(self.filename), self.name)
991 log.error('Invalid size for file: {}'.format(self.filename), self.name)
992 else:
992 else:
993 fp.seek(pos)
993 fp.seek(pos)
994 if not(basicHeaderObj.read(fp)):
994 if not(basicHeaderObj.read(fp)):
995 flag = False
995 flag = False
996 dt2 = basicHeaderObj.datatime
996 dt2 = basicHeaderObj.datatime
997 if not self.isDateTimeInRange(dt1, self.startDate, self.endDate, self.startTime, self.endTime) and not \
997 if not self.isDateTimeInRange(dt1, self.startDate, self.endDate, self.startTime, self.endTime) and not \
998 self.isDateTimeInRange(dt2, self.startDate, self.endDate, self.startTime, self.endTime):
998 self.isDateTimeInRange(dt2, self.startDate, self.endDate, self.startTime, self.endTime):
999 flag = False
999 flag = False
1000
1000
1001 fp.close()
1001 fp.close()
1002 return flag
1002 return flag
1003
1003
1004 def findDatafiles(self, path, startDate=None, endDate=None, expLabel='', ext='.r', walk=True, include_path=False):
1004 def findDatafiles(self, path, startDate=None, endDate=None, expLabel='', ext='.r', walk=True, include_path=False):
1005
1005
1006 path_empty = True
1006 path_empty = True
1007
1007
1008 dateList = []
1008 dateList = []
1009 pathList = []
1009 pathList = []
1010
1010
1011 multi_path = path.split(',')
1011 multi_path = path.split(',')
1012
1012
1013 if not walk:
1013 if not walk:
1014
1014
1015 for single_path in multi_path:
1015 for single_path in multi_path:
1016
1016
1017 if not os.path.isdir(single_path):
1017 if not os.path.isdir(single_path):
1018 continue
1018 continue
1019
1019
1020 fileList = glob.glob1(single_path, "*" + ext)
1020 fileList = glob.glob1(single_path, "*" + ext)
1021
1021
1022 if not fileList:
1022 if not fileList:
1023 continue
1023 continue
1024
1024
1025 path_empty = False
1025 path_empty = False
1026
1026
1027 fileList.sort()
1027 fileList.sort()
1028
1028
1029 for thisFile in fileList:
1029 for thisFile in fileList:
1030
1030
1031 if not os.path.isfile(os.path.join(single_path, thisFile)):
1031 if not os.path.isfile(os.path.join(single_path, thisFile)):
1032 continue
1032 continue
1033
1033
1034 if not isRadarFile(thisFile):
1034 if not isRadarFile(thisFile):
1035 continue
1035 continue
1036
1036
1037 if not isFileInDateRange(thisFile, startDate, endDate):
1037 if not isFileInDateRange(thisFile, startDate, endDate):
1038 continue
1038 continue
1039
1039
1040 thisDate = getDateFromRadarFile(thisFile)
1040 thisDate = getDateFromRadarFile(thisFile)
1041
1041
1042 if thisDate in dateList or single_path in pathList:
1042 if thisDate in dateList or single_path in pathList:
1043 continue
1043 continue
1044
1044
1045 dateList.append(thisDate)
1045 dateList.append(thisDate)
1046 pathList.append(single_path)
1046 pathList.append(single_path)
1047
1047
1048 else:
1048 else:
1049 for single_path in multi_path:
1049 for single_path in multi_path:
1050
1050
1051 if not os.path.isdir(single_path):
1051 if not os.path.isdir(single_path):
1052 continue
1052 continue
1053
1053
1054 dirList = []
1054 dirList = []
1055
1055
1056 for thisPath in os.listdir(single_path):
1056 for thisPath in os.listdir(single_path):
1057
1057
1058 if not os.path.isdir(os.path.join(single_path, thisPath)):
1058 if not os.path.isdir(os.path.join(single_path, thisPath)):
1059 continue
1059 continue
1060
1060
1061 if not isRadarFolder(thisPath):
1061 if not isRadarFolder(thisPath):
1062 continue
1062 continue
1063
1063
1064 if not isFolderInDateRange(thisPath, startDate, endDate):
1064 if not isFolderInDateRange(thisPath, startDate, endDate):
1065 continue
1065 continue
1066
1066
1067 dirList.append(thisPath)
1067 dirList.append(thisPath)
1068
1068
1069 if not dirList:
1069 if not dirList:
1070 continue
1070 continue
1071
1071
1072 dirList.sort()
1072 dirList.sort()
1073
1073
1074 for thisDir in dirList:
1074 for thisDir in dirList:
1075
1075
1076 datapath = os.path.join(single_path, thisDir, expLabel)
1076 datapath = os.path.join(single_path, thisDir, expLabel)
1077 fileList = glob.glob1(datapath, "*" + ext)
1077 fileList = glob.glob1(datapath, "*" + ext)
1078
1078
1079 if not fileList:
1079 if not fileList:
1080 continue
1080 continue
1081
1081
1082 path_empty = False
1082 path_empty = False
1083
1083
1084 thisDate = getDateFromRadarFolder(thisDir)
1084 thisDate = getDateFromRadarFolder(thisDir)
1085
1085
1086 pathList.append(datapath)
1086 pathList.append(datapath)
1087 dateList.append(thisDate)
1087 dateList.append(thisDate)
1088
1088
1089 dateList.sort()
1089 dateList.sort()
1090
1090
1091 if walk:
1091 if walk:
1092 pattern_path = os.path.join(multi_path[0], "[dYYYYDDD]", expLabel)
1092 pattern_path = os.path.join(multi_path[0], "[dYYYYDDD]", expLabel)
1093 else:
1093 else:
1094 pattern_path = multi_path[0]
1094 pattern_path = multi_path[0]
1095
1095
1096 if path_empty:
1096 if path_empty:
1097 raise schainpy.admin.SchainError("[Reading] No *%s files in %s for %s to %s" % (ext, pattern_path, startDate, endDate))
1097 raise schainpy.admin.SchainError("[Reading] No *%s files in %s for %s to %s" % (ext, pattern_path, startDate, endDate))
1098 else:
1098 else:
1099 if not dateList:
1099 if not dateList:
1100 raise schainpy.admin.SchainError("[Reading] Date range selected invalid [%s - %s]: No *%s files in %s)" % (startDate, endDate, ext, path))
1100 raise schainpy.admin.SchainError("[Reading] Date range selected invalid [%s - %s]: No *%s files in %s)" % (startDate, endDate, ext, path))
1101
1101
1102 if include_path:
1102 if include_path:
1103 return dateList, pathList
1103 return dateList, pathList
1104
1104
1105 return dateList
1105 return dateList
1106
1106
1107 def setup(self, **kwargs):
1107 def setup(self, **kwargs):
1108
1108
1109 self.set_kwargs(**kwargs)
1109 self.set_kwargs(**kwargs)
1110 if not self.ext.startswith('.'):
1110 if not self.ext.startswith('.'):
1111 self.ext = '.{}'.format(self.ext)
1111 self.ext = '.{}'.format(self.ext)
1112
1112
1113 if self.server is not None:
1113 if self.server is not None:
1114 if 'tcp://' in self.server:
1114 if 'tcp://' in self.server:
1115 address = server
1115 address = server
1116 else:
1116 else:
1117 address = 'ipc:///tmp/%s' % self.server
1117 address = 'ipc:///tmp/%s' % self.server
1118 self.server = address
1118 self.server = address
1119 self.context = zmq.Context()
1119 self.context = zmq.Context()
1120 self.receiver = self.context.socket(zmq.PULL)
1120 self.receiver = self.context.socket(zmq.PULL)
1121 self.receiver.connect(self.server)
1121 self.receiver.connect(self.server)
1122 time.sleep(0.5)
1122 time.sleep(0.5)
1123 print('[Starting] ReceiverData from {}'.format(self.server))
1123 print('[Starting] ReceiverData from {}'.format(self.server))
1124 else:
1124 else:
1125 self.server = None
1125 self.server = None
1126 if self.path == None:
1126 if self.path == None:
1127 raise ValueError("[Reading] The path is not valid")
1127 raise ValueError("[Reading] The path is not valid")
1128
1128
1129 if self.online:
1129 if self.online:
1130 log.log("[Reading] Searching files in online mode...", self.name)
1130 log.log("[Reading] Searching files in online mode...", self.name)
1131
1131
1132 for nTries in range(self.nTries):
1132 for nTries in range(self.nTries):
1133 fullpath = self.searchFilesOnLine(self.path, self.startDate,
1133 fullpath = self.searchFilesOnLine(self.path, self.startDate,
1134 self.endDate, self.expLabel, self.ext, self.walk,
1134 self.endDate, self.expLabel, self.ext, self.walk,
1135 self.filefmt, self.folderfmt)
1135 self.filefmt, self.folderfmt)
1136
1136
1137 try:
1137 try:
1138 fullpath = next(fullpath)
1138 fullpath = next(fullpath)
1139 except:
1139 except:
1140 fullpath = None
1140 fullpath = None
1141
1141
1142 if fullpath:
1142 if fullpath:
1143 break
1143 break
1144
1144
1145 log.warning(
1145 log.warning(
1146 'Waiting {} sec for a valid file in {}: try {} ...'.format(
1146 'Waiting {} sec for a valid file in {}: try {} ...'.format(
1147 self.delay, self.path, nTries + 1),
1147 self.delay, self.path, nTries + 1),
1148 self.name)
1148 self.name)
1149 time.sleep(self.delay)
1149 time.sleep(self.delay)
1150
1150
1151 if not(fullpath):
1151 if not(fullpath):
1152 raise schainpy.admin.SchainError(
1152 raise schainpy.admin.SchainError(
1153 'There isn\'t any valid file in {}'.format(self.path))
1153 'There isn\'t any valid file in {}'.format(self.path))
1154
1154
1155 pathname, filename = os.path.split(fullpath)
1155 pathname, filename = os.path.split(fullpath)
1156 self.year = int(filename[1:5])
1156 self.year = int(filename[1:5])
1157 self.doy = int(filename[5:8])
1157 self.doy = int(filename[5:8])
1158 self.set = int(filename[8:11]) - 1
1158 self.set = int(filename[8:11]) - 1
1159 else:
1159 else:
1160 log.log("Searching files in {}".format(self.path), self.name)
1160 log.log("Searching files in {}".format(self.path), self.name)
1161 self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
1161 self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
1162 self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt)
1162 self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt)
1163
1163
1164 self.setNextFile()
1164 self.setNextFile()
1165
1165
1166 return
1166 return
1167
1167
1168 def getBasicHeader(self):
1168 def getBasicHeader(self):
1169
1169
1170 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \
1170 self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \
1171 1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1171 1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
1172
1172
1173 self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
1173 self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
1174
1174
1175 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1175 self.dataOut.timeZone = self.basicHeaderObj.timeZone
1176
1176
1177 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1177 self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
1178
1178
1179 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1179 self.dataOut.errorCount = self.basicHeaderObj.errorCount
1180
1180
1181 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1181 self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
1182
1182
1183 self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs
1183 self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs
1184
1184
1185 def getFirstHeader(self):
1185 def getFirstHeader(self):
1186
1186
1187 raise NotImplementedError
1187 raise NotImplementedError
1188
1188
1189 def getData(self):
1189 def getData(self):
1190
1190
1191 raise NotImplementedError
1191 raise NotImplementedError
1192
1192
1193 def hasNotDataInBuffer(self):
1193 def hasNotDataInBuffer(self):
1194
1194
1195 raise NotImplementedError
1195 raise NotImplementedError
1196
1196
1197 def readBlock(self):
1197 def readBlock(self):
1198
1198
1199 raise NotImplementedError
1199 raise NotImplementedError
1200
1200
1201 def isEndProcess(self):
1201 def isEndProcess(self):
1202
1202
1203 return self.flagNoMoreFiles
1203 return self.flagNoMoreFiles
1204
1204
1205 def printReadBlocks(self):
1205 def printReadBlocks(self):
1206
1206
1207 print("[Reading] Number of read blocks per file %04d" % self.nReadBlocks)
1207 print("[Reading] Number of read blocks per file %04d" % self.nReadBlocks)
1208
1208
1209 def printTotalBlocks(self):
1209 def printTotalBlocks(self):
1210
1210
1211 print("[Reading] Number of read blocks %04d" % self.nTotalBlocks)
1211 print("[Reading] Number of read blocks %04d" % self.nTotalBlocks)
1212
1212
1213 def run(self, **kwargs):
1213 def run(self, **kwargs):
1214 """
1214 """
1215
1215
1216 Arguments:
1216 Arguments:
1217 path :
1217 path :
1218 startDate :
1218 startDate :
1219 endDate :
1219 endDate :
1220 startTime :
1220 startTime :
1221 endTime :
1221 endTime :
1222 set :
1222 set :
1223 expLabel :
1223 expLabel :
1224 ext :
1224 ext :
1225 online :
1225 online :
1226 delay :
1226 delay :
1227 walk :
1227 walk :
1228 getblock :
1228 getblock :
1229 nTxs :
1229 nTxs :
1230 realtime :
1230 realtime :
1231 blocksize :
1231 blocksize :
1232 blocktime :
1232 blocktime :
1233 skip :
1233 skip :
1234 cursor :
1234 cursor :
1235 warnings :
1235 warnings :
1236 server :
1236 server :
1237 verbose :
1237 verbose :
1238 format :
1238 format :
1239 oneDDict :
1239 oneDDict :
1240 twoDDict :
1240 twoDDict :
1241 independentParam :
1241 independentParam :
1242 """
1242 """
1243
1243
1244 if not(self.isConfig):
1244 if not(self.isConfig):
1245 self.setup(**kwargs)
1245 self.setup(**kwargs)
1246 self.isConfig = True
1246 self.isConfig = True
1247 if self.server is None:
1247 if self.server is None:
1248 self.getData()
1248 self.getData()
1249 else:
1249 else:
1250 self.getFromServer()
1250 self.getFromServer()
1251
1251
1252
1252
1253 class JRODataWriter(Reader):
1253 class JRODataWriter(Reader):
1254
1254
1255 """
1255 """
1256 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1256 Esta clase permite escribir datos a archivos procesados (.r o ,pdata). La escritura
1257 de los datos siempre se realiza por bloques.
1257 de los datos siempre se realiza por bloques.
1258 """
1258 """
1259
1259
1260 setFile = None
1260 setFile = None
1261 profilesPerBlock = None
1261 profilesPerBlock = None
1262 blocksPerFile = None
1262 blocksPerFile = None
1263 nWriteBlocks = 0
1263 nWriteBlocks = 0
1264 fileDate = None
1264 fileDate = None
1265
1265
1266 def __init__(self, dataOut=None):
1266 def __init__(self, dataOut=None):
1267 raise NotImplementedError
1267 raise NotImplementedError
1268
1268
1269 def hasAllDataInBuffer(self):
1269 def hasAllDataInBuffer(self):
1270 raise NotImplementedError
1270 raise NotImplementedError
1271
1271
1272 def setBlockDimension(self):
1272 def setBlockDimension(self):
1273 raise NotImplementedError
1273 raise NotImplementedError
1274
1274
1275 def writeBlock(self):
1275 def writeBlock(self):
1276 raise NotImplementedError
1276 raise NotImplementedError
1277
1277
1278 def putData(self):
1278 def putData(self):
1279 raise NotImplementedError
1279 raise NotImplementedError
1280
1280
1281 def getDtypeWidth(self):
1281 def getDtypeWidth(self):
1282
1282
1283 dtype_index = get_dtype_index(self.dtype)
1283 dtype_index = get_dtype_index(self.dtype)
1284 dtype_width = get_dtype_width(dtype_index)
1284 dtype_width = get_dtype_width(dtype_index)
1285
1285
1286 return dtype_width
1286 return dtype_width
1287
1287
1288 def getProcessFlags(self):
1288 def getProcessFlags(self):
1289
1289
1290 processFlags = 0
1290 processFlags = 0
1291
1291
1292 dtype_index = get_dtype_index(self.dtype)
1292 dtype_index = get_dtype_index(self.dtype)
1293 procflag_dtype = get_procflag_dtype(dtype_index)
1293 procflag_dtype = get_procflag_dtype(dtype_index)
1294
1294
1295 processFlags += procflag_dtype
1295 processFlags += procflag_dtype
1296
1296
1297 if self.dataOut.flagDecodeData:
1297 if self.dataOut.flagDecodeData:
1298 processFlags += PROCFLAG.DECODE_DATA
1298 processFlags += PROCFLAG.DECODE_DATA
1299
1299
1300 if self.dataOut.flagDeflipData:
1300 if self.dataOut.flagDeflipData:
1301 processFlags += PROCFLAG.DEFLIP_DATA
1301 processFlags += PROCFLAG.DEFLIP_DATA
1302
1302
1303 if self.dataOut.code is not None:
1303 if self.dataOut.code is not None:
1304 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
1304 processFlags += PROCFLAG.DEFINE_PROCESS_CODE
1305
1305
1306 if self.dataOut.nCohInt > 1:
1306 if self.dataOut.nCohInt > 1:
1307 processFlags += PROCFLAG.COHERENT_INTEGRATION
1307 processFlags += PROCFLAG.COHERENT_INTEGRATION
1308
1308
1309 if self.dataOut.type == "Spectra":
1309 if self.dataOut.type == "Spectra":
1310 if self.dataOut.nIncohInt > 1:
1310 if self.dataOut.nIncohInt > 1:
1311 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
1311 processFlags += PROCFLAG.INCOHERENT_INTEGRATION
1312
1312
1313 if self.dataOut.data_dc is not None:
1313 if self.dataOut.data_dc is not None:
1314 processFlags += PROCFLAG.SAVE_CHANNELS_DC
1314 processFlags += PROCFLAG.SAVE_CHANNELS_DC
1315
1315
1316 if self.dataOut.flagShiftFFT:
1316 if self.dataOut.flagShiftFFT:
1317 processFlags += PROCFLAG.SHIFT_FFT_DATA
1317 processFlags += PROCFLAG.SHIFT_FFT_DATA
1318
1318
1319 return processFlags
1319 return processFlags
1320
1320
1321 def setBasicHeader(self):
1321 def setBasicHeader(self):
1322
1322
1323 self.basicHeaderObj.size = self.basicHeaderSize # bytes
1323 self.basicHeaderObj.size = self.basicHeaderSize # bytes
1324 self.basicHeaderObj.version = self.versionFile
1324 self.basicHeaderObj.version = self.versionFile
1325 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1325 self.basicHeaderObj.dataBlock = self.nTotalBlocks
1326 utc = numpy.floor(self.dataOut.utctime)
1326 utc = numpy.floor(self.dataOut.utctime)
1327 milisecond = (self.dataOut.utctime - utc) * 1000.0
1327 milisecond = (self.dataOut.utctime - utc) * 1000.0
1328 self.basicHeaderObj.utc = utc
1328 self.basicHeaderObj.utc = utc
1329 self.basicHeaderObj.miliSecond = milisecond
1329 self.basicHeaderObj.miliSecond = milisecond
1330 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1330 self.basicHeaderObj.timeZone = self.dataOut.timeZone
1331 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1331 self.basicHeaderObj.dstFlag = self.dataOut.dstFlag
1332 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1332 self.basicHeaderObj.errorCount = self.dataOut.errorCount
1333
1333
1334 def setFirstHeader(self):
1334 def setFirstHeader(self):
1335 """
1335 """
1336 Obtiene una copia del First Header
1336 Obtiene una copia del First Header
1337
1337
1338 Affected:
1338 Affected:
1339
1339
1340 self.basicHeaderObj
1340 self.basicHeaderObj
1341 self.systemHeaderObj
1341 self.systemHeaderObj
1342 self.radarControllerHeaderObj
1342 self.radarControllerHeaderObj
1343 self.processingHeaderObj self.
1343 self.processingHeaderObj self.
1344
1344
1345 Return:
1345 Return:
1346 None
1346 None
1347 """
1347 """
1348
1348
1349 raise NotImplementedError
1349 raise NotImplementedError
1350
1350
1351 def __writeFirstHeader(self):
1351 def __writeFirstHeader(self):
1352 """
1352 """
1353 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1353 Escribe el primer header del file es decir el Basic header y el Long header (SystemHeader, RadarControllerHeader, ProcessingHeader)
1354
1354
1355 Affected:
1355 Affected:
1356 __dataType
1356 __dataType
1357
1357
1358 Return:
1358 Return:
1359 None
1359 None
1360 """
1360 """
1361
1361
1362 # CALCULAR PARAMETROS
1362 # CALCULAR PARAMETROS
1363
1363
1364 sizeLongHeader = self.systemHeaderObj.size + \
1364 sizeLongHeader = self.systemHeaderObj.size + \
1365 self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1365 self.radarControllerHeaderObj.size + self.processingHeaderObj.size
1366 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1366 self.basicHeaderObj.size = self.basicHeaderSize + sizeLongHeader
1367
1367
1368 self.basicHeaderObj.write(self.fp)
1368 self.basicHeaderObj.write(self.fp)
1369 self.systemHeaderObj.write(self.fp)
1369 self.systemHeaderObj.write(self.fp)
1370 self.radarControllerHeaderObj.write(self.fp)
1370 self.radarControllerHeaderObj.write(self.fp)
1371 self.processingHeaderObj.write(self.fp)
1371 self.processingHeaderObj.write(self.fp)
1372
1372
1373 def __setNewBlock(self):
1373 def __setNewBlock(self):
1374 """
1374 """
1375 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1375 Si es un nuevo file escribe el First Header caso contrario escribe solo el Basic Header
1376
1376
1377 Return:
1377 Return:
1378 0 : si no pudo escribir nada
1378 0 : si no pudo escribir nada
1379 1 : Si escribio el Basic el First Header
1379 1 : Si escribio el Basic el First Header
1380 """
1380 """
1381 if self.fp == None:
1381 if self.fp == None:
1382 self.setNextFile()
1382 self.setNextFile()
1383
1383
1384 if self.flagIsNewFile:
1384 if self.flagIsNewFile:
1385 return 1
1385 return 1
1386
1386
1387 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1387 if self.blockIndex < self.processingHeaderObj.dataBlocksPerFile:
1388 self.basicHeaderObj.write(self.fp)
1388 self.basicHeaderObj.write(self.fp)
1389 return 1
1389 return 1
1390
1390
1391 if not(self.setNextFile()):
1391 if not(self.setNextFile()):
1392 return 0
1392 return 0
1393
1393
1394 return 1
1394 return 1
1395
1395
1396 def writeNextBlock(self):
1396 def writeNextBlock(self):
1397 """
1397 """
1398 Selecciona el bloque siguiente de datos y los escribe en un file
1398 Selecciona el bloque siguiente de datos y los escribe en un file
1399
1399
1400 Return:
1400 Return:
1401 0 : Si no hizo pudo escribir el bloque de datos
1401 0 : Si no hizo pudo escribir el bloque de datos
1402 1 : Si no pudo escribir el bloque de datos
1402 1 : Si no pudo escribir el bloque de datos
1403 """
1403 """
1404 if not(self.__setNewBlock()):
1404 if not(self.__setNewBlock()):
1405 return 0
1405 return 0
1406
1406
1407 self.writeBlock()
1407 self.writeBlock()
1408
1408
1409 print("[Writing] Block No. %d/%d" % (self.blockIndex,
1409 print("[Writing] Block No. %d/%d" % (self.blockIndex,
1410 self.processingHeaderObj.dataBlocksPerFile))
1410 self.processingHeaderObj.dataBlocksPerFile))
1411
1411
1412 return 1
1412 return 1
1413
1413
1414 def setNextFile(self):
1414 def setNextFile(self):
1415 """Determina el siguiente file que sera escrito
1415 """Determina el siguiente file que sera escrito
1416
1416
1417 Affected:
1417 Affected:
1418 self.filename
1418 self.filename
1419 self.subfolder
1419 self.subfolder
1420 self.fp
1420 self.fp
1421 self.setFile
1421 self.setFile
1422 self.flagIsNewFile
1422 self.flagIsNewFile
1423
1423
1424 Return:
1424 Return:
1425 0 : Si el archivo no puede ser escrito
1425 0 : Si el archivo no puede ser escrito
1426 1 : Si el archivo esta listo para ser escrito
1426 1 : Si el archivo esta listo para ser escrito
1427 """
1427 """
1428 ext = self.ext
1428 ext = self.ext
1429 path = self.path
1429 path = self.path
1430
1430
1431 if self.fp != None:
1431 if self.fp != None:
1432 self.fp.close()
1432 self.fp.close()
1433
1433
1434 if not os.path.exists(path):
1434 if not os.path.exists(path):
1435 os.mkdir(path)
1435 os.mkdir(path)
1436
1436
1437 timeTuple = time.localtime(self.dataOut.utctime)
1437 timeTuple = time.localtime(self.dataOut.utctime)
1438 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year, timeTuple.tm_yday)
1438 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year, timeTuple.tm_yday)
1439
1439
1440 fullpath = os.path.join(path, subfolder)
1440 fullpath = os.path.join(path, subfolder)
1441 setFile = self.setFile
1441 setFile = self.setFile
1442
1442
1443 if not(os.path.exists(fullpath)):
1443 if not(os.path.exists(fullpath)):
1444 os.mkdir(fullpath)
1444 os.mkdir(fullpath)
1445 setFile = -1 # inicializo mi contador de seteo
1445 setFile = -1 # inicializo mi contador de seteo
1446 else:
1446 else:
1447 filesList = os.listdir(fullpath)
1447 filesList = os.listdir(fullpath)
1448 if len(filesList) > 0:
1448 if len(filesList) > 0:
1449 filesList = sorted(filesList, key=str.lower)
1449 filesList = sorted(filesList, key=str.lower)
1450 filen = filesList[-1]
1450 filen = filesList[-1]
1451 # el filename debera tener el siguiente formato
1451 # el filename debera tener el siguiente formato
1452 # 0 1234 567 89A BCDE (hex)
1452 # 0 1234 567 89A BCDE (hex)
1453 # x YYYY DDD SSS .ext
1453 # x YYYY DDD SSS .ext
1454 if isNumber(filen[8:11]):
1454 if isNumber(filen[8:11]):
1455 # inicializo mi contador de seteo al seteo del ultimo file
1455 # inicializo mi contador de seteo al seteo del ultimo file
1456 setFile = int(filen[8:11])
1456 setFile = int(filen[8:11])
1457 else:
1457 else:
1458 setFile = -1
1458 setFile = -1
1459 else:
1459 else:
1460 setFile = -1 # inicializo mi contador de seteo
1460 setFile = -1 # inicializo mi contador de seteo
1461
1461
1462 setFile += 1
1462 setFile += 1
1463
1463
1464 # If this is a new day it resets some values
1464 # If this is a new day it resets some values
1465 if self.dataOut.datatime.date() > self.fileDate:
1465 if self.dataOut.datatime.date() > self.fileDate:
1466 setFile = 0
1466 setFile = 0
1467 self.nTotalBlocks = 0
1467 self.nTotalBlocks = 0
1468
1468
1469 filen = '{}{:04d}{:03d}{:03d}{}'.format(
1469 filen = '{}{:04d}{:03d}{:03d}{}'.format(
1470 self.optchar, timeTuple.tm_year, timeTuple.tm_yday, setFile, ext)
1470 self.optchar, timeTuple.tm_year, timeTuple.tm_yday, setFile, ext)
1471
1471
1472 filename = os.path.join(path, subfolder, filen)
1472 filename = os.path.join(path, subfolder, filen)
1473
1473
1474 fp = open(filename, 'wb')
1474 fp = open(filename, 'wb')
1475
1475
1476 self.blockIndex = 0
1476 self.blockIndex = 0
1477 self.filename = filename
1477 self.filename = filename
1478 self.subfolder = subfolder
1478 self.subfolder = subfolder
1479 self.fp = fp
1479 self.fp = fp
1480 self.setFile = setFile
1480 self.setFile = setFile
1481 self.flagIsNewFile = 1
1481 self.flagIsNewFile = 1
1482 self.fileDate = self.dataOut.datatime.date()
1482 self.fileDate = self.dataOut.datatime.date()
1483 self.setFirstHeader()
1483 self.setFirstHeader()
1484
1484
1485 print('[Writing] Opening file: %s' % self.filename)
1485 print('[Writing] Opening file: %s' % self.filename)
1486
1486
1487 self.__writeFirstHeader()
1487 self.__writeFirstHeader()
1488
1488
1489 return 1
1489 return 1
1490
1490
1491 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=None, ext=None, datatype=4):
1491 def setup(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=None, ext=None, datatype=4):
1492 """
1492 """
1493 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1493 Setea el tipo de formato en la cual sera guardada la data y escribe el First Header
1494
1494
1495 Inputs:
1495 Inputs:
1496 path : directory where data will be saved
1496 path : directory where data will be saved
1497 profilesPerBlock : number of profiles per block
1497 profilesPerBlock : number of profiles per block
1498 set : initial file set
1498 set : initial file set
1499 datatype : An integer number that defines data type:
1499 datatype : An integer number that defines data type:
1500 0 : int8 (1 byte)
1500 0 : int8 (1 byte)
1501 1 : int16 (2 bytes)
1501 1 : int16 (2 bytes)
1502 2 : int32 (4 bytes)
1502 2 : int32 (4 bytes)
1503 3 : int64 (8 bytes)
1503 3 : int64 (8 bytes)
1504 4 : float32 (4 bytes)
1504 4 : float32 (4 bytes)
1505 5 : double64 (8 bytes)
1505 5 : double64 (8 bytes)
1506
1506
1507 Return:
1507 Return:
1508 0 : Si no realizo un buen seteo
1508 0 : Si no realizo un buen seteo
1509 1 : Si realizo un buen seteo
1509 1 : Si realizo un buen seteo
1510 """
1510 """
1511
1511
1512 if ext == None:
1512 if ext == None:
1513 ext = self.ext
1513 ext = self.ext
1514
1514
1515 self.ext = ext.lower()
1515 self.ext = ext.lower()
1516
1516
1517 self.path = path
1517 self.path = path
1518
1518
1519 if set is None:
1519 if set is None:
1520 self.setFile = -1
1520 self.setFile = -1
1521 else:
1521 else:
1522 self.setFile = set - 1
1522 self.setFile = set - 1
1523
1523
1524 self.blocksPerFile = blocksPerFile
1524 self.blocksPerFile = blocksPerFile
1525 self.profilesPerBlock = profilesPerBlock
1525 self.profilesPerBlock = profilesPerBlock
1526 self.dataOut = dataOut
1526 self.dataOut = dataOut
1527 self.fileDate = self.dataOut.datatime.date()
1527 self.fileDate = self.dataOut.datatime.date()
1528 self.dtype = self.dataOut.dtype
1528 self.dtype = self.dataOut.dtype
1529
1529
1530 if datatype is not None:
1530 if datatype is not None:
1531 self.dtype = get_numpy_dtype(datatype)
1531 self.dtype = get_numpy_dtype(datatype)
1532
1532
1533 if not(self.setNextFile()):
1533 if not(self.setNextFile()):
1534 print("[Writing] There isn't a next file")
1534 print("[Writing] There isn't a next file")
1535 return 0
1535 return 0
1536
1536
1537 self.setBlockDimension()
1537 self.setBlockDimension()
1538
1538
1539 return 1
1539 return 1
1540
1540
1541 def run(self, dataOut, path, blocksPerFile=100, profilesPerBlock=64, set=None, ext=None, datatype=4, **kwargs):
1541 def run(self, dataOut, path, blocksPerFile=100, profilesPerBlock=64, set=None, ext=None, datatype=4, **kwargs):
1542
1542
1543 if not(self.isConfig):
1543 if not(self.isConfig):
1544
1544
1545 self.setup(dataOut, path, blocksPerFile, profilesPerBlock=profilesPerBlock,
1545 self.setup(dataOut, path, blocksPerFile, profilesPerBlock=profilesPerBlock,
1546 set=set, ext=ext, datatype=datatype, **kwargs)
1546 set=set, ext=ext, datatype=datatype, **kwargs)
1547 self.isConfig = True
1547 self.isConfig = True
1548
1548
1549 self.dataOut = dataOut
1549 self.dataOut = dataOut
1550 self.putData()
1550 self.putData()
1551 return self.dataOut
1551 return self.dataOut
1552
1552
1553 @MPDecorator
1553 @MPDecorator
1554 class printInfo(Operation):
1554 class printInfo(Operation):
1555
1555
1556 def __init__(self):
1556 def __init__(self):
1557
1557
1558 Operation.__init__(self)
1558 Operation.__init__(self)
1559 self.__printInfo = True
1559 self.__printInfo = True
1560
1560
1561 def run(self, dataOut, headers = ['systemHeaderObj', 'radarControllerHeaderObj', 'processingHeaderObj']):
1561 def run(self, dataOut, headers = ['systemHeaderObj', 'radarControllerHeaderObj', 'processingHeaderObj']):
1562 if self.__printInfo == False:
1562 if self.__printInfo == False:
1563 return
1563 return
1564
1564
1565 for header in headers:
1565 for header in headers:
1566 if hasattr(dataOut, header):
1566 if hasattr(dataOut, header):
1567 obj = getattr(dataOut, header)
1567 obj = getattr(dataOut, header)
1568 if hasattr(obj, 'printInfo'):
1568 if hasattr(obj, 'printInfo'):
1569 obj.printInfo()
1569 obj.printInfo()
1570 else:
1570 else:
1571 print(obj)
1571 print(obj)
1572 else:
1572 else:
1573 log.warning('Header {} Not found in object'.format(header))
1573 log.warning('Header {} Not found in object'.format(header))
1574
1574
1575 self.__printInfo = False
1575 self.__printInfo = False
@@ -1,663 +1,661
1 '''
1 '''
2 Created on Set 9, 2015
2 Created on Set 9, 2015
3
3
4 @author: roj-idl71 Karim Kuyeng
4 @author: roj-idl71 Karim Kuyeng
5
5
6 @update: 2021, Joab Apaza
6 @update: 2021, Joab Apaza
7 '''
7 '''
8
8
9 import os
9 import os
10 import sys
10 import sys
11 import glob
11 import glob
12 import fnmatch
12 import fnmatch
13 import datetime
13 import datetime
14 import time
14 import time
15 import re
15 import re
16 import h5py
16 import h5py
17 import numpy
17 import numpy
18
18
19 try:
19 try:
20 from gevent import sleep
20 from gevent import sleep
21 except:
21 except:
22 from time import sleep
22 from time import sleep
23
23
24 from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader
24 from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader
25 from schainpy.model.data.jrodata import Voltage
25 from schainpy.model.data.jrodata import Voltage
26 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
26 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
27 from numpy import imag
27 from numpy import imag
28
28
29
29
30 class AMISRReader(ProcessingUnit):
30 class AMISRReader(ProcessingUnit):
31 '''
31 '''
32 classdocs
32 classdocs
33 '''
33 '''
34
34
35 def __init__(self):
35 def __init__(self):
36 '''
36 '''
37 Constructor
37 Constructor
38 '''
38 '''
39
39
40 ProcessingUnit.__init__(self)
40 ProcessingUnit.__init__(self)
41
41
42 self.set = None
42 self.set = None
43 self.subset = None
43 self.subset = None
44 self.extension_file = '.h5'
44 self.extension_file = '.h5'
45 self.dtc_str = 'dtc'
45 self.dtc_str = 'dtc'
46 self.dtc_id = 0
46 self.dtc_id = 0
47 self.status = True
47 self.status = True
48 self.isConfig = False
48 self.isConfig = False
49 self.dirnameList = []
49 self.dirnameList = []
50 self.filenameList = []
50 self.filenameList = []
51 self.fileIndex = None
51 self.fileIndex = None
52 self.flagNoMoreFiles = False
52 self.flagNoMoreFiles = False
53 self.flagIsNewFile = 0
53 self.flagIsNewFile = 0
54 self.filename = ''
54 self.filename = ''
55 self.amisrFilePointer = None
55 self.amisrFilePointer = None
56 self.realBeamCode = []
56 self.realBeamCode = []
57 self.beamCodeMap = None
57 self.beamCodeMap = None
58 self.azimuthList = []
58 self.azimuthList = []
59 self.elevationList = []
59 self.elevationList = []
60 self.dataShape = None
60 self.dataShape = None
61
61
62
62
63
63
64 self.profileIndex = 0
64 self.profileIndex = 0
65
65
66
66
67 self.beamCodeByFrame = None
67 self.beamCodeByFrame = None
68 self.radacTimeByFrame = None
68 self.radacTimeByFrame = None
69
69
70 self.dataset = None
70 self.dataset = None
71
71
72 self.__firstFile = True
72 self.__firstFile = True
73
73
74 self.buffer = None
74 self.buffer = None
75
75
76 self.timezone = 'ut'
76 self.timezone = 'ut'
77
77
78 self.__waitForNewFile = 20
78 self.__waitForNewFile = 20
79 self.__filename_online = None
79 self.__filename_online = None
80 #Is really necessary create the output object in the initializer
80 #Is really necessary create the output object in the initializer
81 self.dataOut = Voltage()
81 self.dataOut = Voltage()
82 self.dataOut.error=False
82 self.dataOut.error=False
83
83
84
84
85 def setup(self,path=None,
85 def setup(self,path=None,
86 startDate=None,
86 startDate=None,
87 endDate=None,
87 endDate=None,
88 startTime=None,
88 startTime=None,
89 endTime=None,
89 endTime=None,
90 walk=True,
90 walk=True,
91 timezone='ut',
91 timezone='ut',
92 all=0,
92 all=0,
93 code = None,
93 code = None,
94 nCode = 0,
94 nCode = 0,
95 nBaud = 0,
95 nBaud = 0,
96 online=False):
96 online=False):
97
97
98
98
99
99
100 self.timezone = timezone
100 self.timezone = timezone
101 self.all = all
101 self.all = all
102 self.online = online
102 self.online = online
103
103
104 self.code = code
104 self.code = code
105 self.nCode = int(nCode)
105 self.nCode = int(nCode)
106 self.nBaud = int(nBaud)
106 self.nBaud = int(nBaud)
107
107
108
108
109
109
110 #self.findFiles()
110 #self.findFiles()
111 if not(online):
111 if not(online):
112 #Busqueda de archivos offline
112 #Busqueda de archivos offline
113 self.searchFilesOffLine(path, startDate, endDate, startTime, endTime, walk)
113 self.searchFilesOffLine(path, startDate, endDate, startTime, endTime, walk)
114 else:
114 else:
115 self.searchFilesOnLine(path, startDate, endDate, startTime,endTime,walk)
115 self.searchFilesOnLine(path, startDate, endDate, startTime,endTime,walk)
116
116
117 if not(self.filenameList):
117 if not(self.filenameList):
118 print("There is no files into the folder: %s"%(path))
118 print("There is no files into the folder: %s"%(path))
119 sys.exit()
119 sys.exit()
120
120
121 self.fileIndex = 0
121 self.fileIndex = 0
122
122
123 self.readNextFile(online)
123 self.readNextFile(online)
124
124
125 '''
125 '''
126 Add code
126 Add code
127 '''
127 '''
128 self.isConfig = True
128 self.isConfig = True
129 # print("Setup Done")
129 # print("Setup Done")
130 pass
130 pass
131
131
132
132
133 def readAMISRHeader(self,fp):
133 def readAMISRHeader(self,fp):
134
134
135 if self.isConfig and (not self.flagNoMoreFiles):
135 if self.isConfig and (not self.flagNoMoreFiles):
136 newShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
136 newShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
137 if self.dataShape != newShape and newShape != None:
137 if self.dataShape != newShape and newShape != None:
138 print("\nNEW FILE HAS A DIFFERENT SHAPE")
138 print("\nNEW FILE HAS A DIFFERENT SHAPE")
139 print(self.dataShape,newShape,"\n")
139 print(self.dataShape,newShape,"\n")
140 return 0
140 return 0
141 else:
141 else:
142 self.dataShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
142 self.dataShape = fp.get('Raw11/Data/Samples/Data').shape[1:]
143
143
144
144
145 header = 'Raw11/Data/RadacHeader'
145 header = 'Raw11/Data/RadacHeader'
146 self.beamCodeByPulse = fp.get(header+'/BeamCode') # LIST OF BEAMS PER PROFILE, TO BE USED ON REARRANGE
146 self.beamCodeByPulse = fp.get(header+'/BeamCode') # LIST OF BEAMS PER PROFILE, TO BE USED ON REARRANGE
147 if (self.startDate> datetime.date(2021, 7, 15)): #Se cambió la forma de extracción de Apuntes el 17
147 if (self.startDate> datetime.date(2021, 7, 15)): #Se cambió la forma de extracción de Apuntes el 17
148 self.beamcodeFile = fp['Setup/Beamcodefile'][()].decode()
148 self.beamcodeFile = fp['Setup/Beamcodefile'][()].decode()
149 self.trueBeams = self.beamcodeFile.split("\n")
149 self.trueBeams = self.beamcodeFile.split("\n")
150 self.trueBeams.pop()#remove last
150 self.trueBeams.pop()#remove last
151 [self.realBeamCode.append(x) for x in self.trueBeams if x not in self.realBeamCode]
151 [self.realBeamCode.append(x) for x in self.trueBeams if x not in self.realBeamCode]
152 self.beamCode = [int(x, 16) for x in self.realBeamCode]
152 self.beamCode = [int(x, 16) for x in self.realBeamCode]
153 else:
153 else:
154 _beamCode= fp.get('Raw11/Data/Beamcodes') #se usa la manera previa al cambio de apuntes
154 _beamCode= fp.get('Raw11/Data/Beamcodes') #se usa la manera previa al cambio de apuntes
155 self.beamCode = _beamCode[0,:]
155 self.beamCode = _beamCode[0,:]
156
156
157 if self.beamCodeMap == None:
157 if self.beamCodeMap == None:
158 self.beamCodeMap = fp['Setup/BeamcodeMap']
158 self.beamCodeMap = fp['Setup/BeamcodeMap']
159 for beam in self.beamCode:
159 for beam in self.beamCode:
160 beamAziElev = numpy.where(self.beamCodeMap[:,0]==beam)
160 beamAziElev = numpy.where(self.beamCodeMap[:,0]==beam)
161 beamAziElev = beamAziElev[0].squeeze()
161 beamAziElev = beamAziElev[0].squeeze()
162 self.azimuthList.append(self.beamCodeMap[beamAziElev,1])
162 self.azimuthList.append(self.beamCodeMap[beamAziElev,1])
163 self.elevationList.append(self.beamCodeMap[beamAziElev,2])
163 self.elevationList.append(self.beamCodeMap[beamAziElev,2])
164 #print("Beamssss: ",self.beamCodeMap[beamAziElev,1],self.beamCodeMap[beamAziElev,2])
164 #print("Beamssss: ",self.beamCodeMap[beamAziElev,1],self.beamCodeMap[beamAziElev,2])
165 #print(self.beamCode)
165 #print(self.beamCode)
166 #self.code = fp.get(header+'/Code') # NOT USE FOR THIS
166 #self.code = fp.get(header+'/Code') # NOT USE FOR THIS
167 self.frameCount = fp.get(header+'/FrameCount')# NOT USE FOR THIS
167 self.frameCount = fp.get(header+'/FrameCount')# NOT USE FOR THIS
168 self.modeGroup = fp.get(header+'/ModeGroup')# NOT USE FOR THIS
168 self.modeGroup = fp.get(header+'/ModeGroup')# NOT USE FOR THIS
169 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')# TO GET NSA OR USING DATA FOR THAT
169 self.nsamplesPulse = fp.get(header+'/NSamplesPulse')# TO GET NSA OR USING DATA FOR THAT
170 self.pulseCount = fp.get(header+'/PulseCount')# NOT USE FOR THIS
170 self.pulseCount = fp.get(header+'/PulseCount')# NOT USE FOR THIS
171 self.radacTime = fp.get(header+'/RadacTime')# 1st TIME ON FILE ANDE CALCULATE THE REST WITH IPP*nindexprofile
171 self.radacTime = fp.get(header+'/RadacTime')# 1st TIME ON FILE ANDE CALCULATE THE REST WITH IPP*nindexprofile
172 self.timeCount = fp.get(header+'/TimeCount')# NOT USE FOR THIS
172 self.timeCount = fp.get(header+'/TimeCount')# NOT USE FOR THIS
173 self.timeStatus = fp.get(header+'/TimeStatus')# NOT USE FOR THIS
173 self.timeStatus = fp.get(header+'/TimeStatus')# NOT USE FOR THIS
174 self.rangeFromFile = fp.get('Raw11/Data/Samples/Range')
174 self.rangeFromFile = fp.get('Raw11/Data/Samples/Range')
175 self.frequency = fp.get('Rx/Frequency')
175 self.frequency = fp.get('Rx/Frequency')
176 txAus = fp.get('Raw11/Data/Pulsewidth')
176 txAus = fp.get('Raw11/Data/Pulsewidth')
177
177
178
178
179 self.nblocks = self.pulseCount.shape[0] #nblocks
179 self.nblocks = self.pulseCount.shape[0] #nblocks
180
180
181 self.nprofiles = self.pulseCount.shape[1] #nprofile
181 self.nprofiles = self.pulseCount.shape[1] #nprofile
182 self.nsa = self.nsamplesPulse[0,0] #ngates
182 self.nsa = self.nsamplesPulse[0,0] #ngates
183 self.nchannels = len(self.beamCode)
183 self.nchannels = len(self.beamCode)
184 self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds
184 self.ippSeconds = (self.radacTime[0][1] -self.radacTime[0][0]) #Ipp in seconds
185 #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec
185 #self.__waitForNewFile = self.nblocks # wait depending on the number of blocks since each block is 1 sec
186 self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created
186 self.__waitForNewFile = self.nblocks * self.nprofiles * self.ippSeconds # wait until new file is created
187
187
188 #filling radar controller header parameters
188 #filling radar controller header parameters
189 self.__ippKm = self.ippSeconds *.15*1e6 # in km
189 self.__ippKm = self.ippSeconds *.15*1e6 # in km
190 self.__txA = (txAus.value)*.15 #(ipp[us]*.15km/1us) in km
190 self.__txA = (txAus.value)*.15 #(ipp[us]*.15km/1us) in km
191 self.__txB = 0
191 self.__txB = 0
192 nWindows=1
192 nWindows=1
193 self.__nSamples = self.nsa
193 self.__nSamples = self.nsa
194 self.__firstHeight = self.rangeFromFile[0][0]/1000 #in km
194 self.__firstHeight = self.rangeFromFile[0][0]/1000 #in km
195 self.__deltaHeight = (self.rangeFromFile[0][1] - self.rangeFromFile[0][0])/1000
195 self.__deltaHeight = (self.rangeFromFile[0][1] - self.rangeFromFile[0][0])/1000
196
196
197 #for now until understand why the code saved is different (code included even though code not in tuf file)
197 #for now until understand why the code saved is different (code included even though code not in tuf file)
198 #self.__codeType = 0
198 #self.__codeType = 0
199 # self.__nCode = None
199 # self.__nCode = None
200 # self.__nBaud = None
200 # self.__nBaud = None
201 self.__code = self.code
201 self.__code = self.code
202 self.__codeType = 0
202 self.__codeType = 0
203 if self.code != None:
203 if self.code != None:
204 self.__codeType = 1
204 self.__codeType = 1
205 self.__nCode = self.nCode
205 self.__nCode = self.nCode
206 self.__nBaud = self.nBaud
206 self.__nBaud = self.nBaud
207 #self.__code = 0
207 #self.__code = 0
208
208
209 #filling system header parameters
209 #filling system header parameters
210 self.__nSamples = self.nsa
210 self.__nSamples = self.nsa
211 self.newProfiles = self.nprofiles/self.nchannels
211 self.newProfiles = self.nprofiles/self.nchannels
212 self.__channelList = list(range(self.nchannels))
212 self.__channelList = list(range(self.nchannels))
213
213
214 self.__frequency = self.frequency[0][0]
214 self.__frequency = self.frequency[0][0]
215
215
216
216
217 return 1
217 return 1
218
218
219
219
220 def createBuffers(self):
220 def createBuffers(self):
221
221
222 pass
222 pass
223
223
224 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
224 def __setParameters(self,path='', startDate='',endDate='',startTime='', endTime='', walk=''):
225 self.path = path
225 self.path = path
226 self.startDate = startDate
226 self.startDate = startDate
227 self.endDate = endDate
227 self.endDate = endDate
228 self.startTime = startTime
228 self.startTime = startTime
229 self.endTime = endTime
229 self.endTime = endTime
230 self.walk = walk
230 self.walk = walk
231
231
232 def __checkPath(self):
232 def __checkPath(self):
233 if os.path.exists(self.path):
233 if os.path.exists(self.path):
234 self.status = 1
234 self.status = 1
235 else:
235 else:
236 self.status = 0
236 self.status = 0
237 print('Path:%s does not exists'%self.path)
237 print('Path:%s does not exists'%self.path)
238
238
239 return
239 return
240
240
241
241
242 def __selDates(self, amisr_dirname_format):
242 def __selDates(self, amisr_dirname_format):
243 try:
243 try:
244 year = int(amisr_dirname_format[0:4])
244 year = int(amisr_dirname_format[0:4])
245 month = int(amisr_dirname_format[4:6])
245 month = int(amisr_dirname_format[4:6])
246 dom = int(amisr_dirname_format[6:8])
246 dom = int(amisr_dirname_format[6:8])
247 thisDate = datetime.date(year,month,dom)
247 thisDate = datetime.date(year,month,dom)
248
248
249 if (thisDate>=self.startDate and thisDate <= self.endDate):
249 if (thisDate>=self.startDate and thisDate <= self.endDate):
250 return amisr_dirname_format
250 return amisr_dirname_format
251 except:
251 except:
252 return None
252 return None
253
253
254
254
255 def __findDataForDates(self,online=False):
255 def __findDataForDates(self,online=False):
256
256
257 if not(self.status):
257 if not(self.status):
258 return None
258 return None
259
259
260 pat = '\d+.\d+'
260 pat = '\d+.\d+'
261 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
261 dirnameList = [re.search(pat,x) for x in os.listdir(self.path)]
262 dirnameList = [x for x in dirnameList if x!=None]
262 dirnameList = [x for x in dirnameList if x!=None]
263 dirnameList = [x.string for x in dirnameList]
263 dirnameList = [x.string for x in dirnameList]
264 if not(online):
264 if not(online):
265 dirnameList = [self.__selDates(x) for x in dirnameList]
265 dirnameList = [self.__selDates(x) for x in dirnameList]
266 dirnameList = [x for x in dirnameList if x!=None]
266 dirnameList = [x for x in dirnameList if x!=None]
267 if len(dirnameList)>0:
267 if len(dirnameList)>0:
268 self.status = 1
268 self.status = 1
269 self.dirnameList = dirnameList
269 self.dirnameList = dirnameList
270 self.dirnameList.sort()
270 self.dirnameList.sort()
271 else:
271 else:
272 self.status = 0
272 self.status = 0
273 return None
273 return None
274
274
275 def __getTimeFromData(self):
275 def __getTimeFromData(self):
276 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
276 startDateTime_Reader = datetime.datetime.combine(self.startDate,self.startTime)
277 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
277 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
278
278
279 print('Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader))
279 print('Filtering Files from %s to %s'%(startDateTime_Reader, endDateTime_Reader))
280 print('........................................')
280 print('........................................')
281 filter_filenameList = []
281 filter_filenameList = []
282 self.filenameList.sort()
282 self.filenameList.sort()
283 #for i in range(len(self.filenameList)-1):
283 #for i in range(len(self.filenameList)-1):
284 for i in range(len(self.filenameList)):
284 for i in range(len(self.filenameList)):
285 filename = self.filenameList[i]
285 filename = self.filenameList[i]
286 fp = h5py.File(filename,'r')
286 fp = h5py.File(filename,'r')
287 time_str = fp.get('Time/RadacTimeString')
287 time_str = fp.get('Time/RadacTimeString')
288
288
289 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
289 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
290 #startDateTimeStr_File = "2019-12-16 09:21:11"
290 #startDateTimeStr_File = "2019-12-16 09:21:11"
291 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
291 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
292 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
292 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
293
293
294 #endDateTimeStr_File = "2019-12-16 11:10:11"
294 #endDateTimeStr_File = "2019-12-16 11:10:11"
295 endDateTimeStr_File = time_str[-1][-1].decode('UTF-8').split('.')[0]
295 endDateTimeStr_File = time_str[-1][-1].decode('UTF-8').split('.')[0]
296 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
296 junk = time.strptime(endDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
297 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
297 endDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
298
298
299 fp.close()
299 fp.close()
300
300
301 #print("check time", startDateTime_File)
301 #print("check time", startDateTime_File)
302 if self.timezone == 'lt':
302 if self.timezone == 'lt':
303 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
303 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
304 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
304 endDateTime_File = endDateTime_File - datetime.timedelta(minutes = 300)
305 if (endDateTime_File>=startDateTime_Reader and endDateTime_File<=endDateTime_Reader):
305 if (endDateTime_File>=startDateTime_Reader and endDateTime_File<=endDateTime_Reader):
306 filter_filenameList.append(filename)
306 filter_filenameList.append(filename)
307
307
308 if (endDateTime_File>endDateTime_Reader):
308 if (endDateTime_File>endDateTime_Reader):
309 break
309 break
310
310
311
311
312 filter_filenameList.sort()
312 filter_filenameList.sort()
313 self.filenameList = filter_filenameList
313 self.filenameList = filter_filenameList
314 return 1
314 return 1
315
315
316 def __filterByGlob1(self, dirName):
316 def __filterByGlob1(self, dirName):
317 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
317 filter_files = glob.glob1(dirName, '*.*%s'%self.extension_file)
318 filter_files.sort()
318 filter_files.sort()
319 filterDict = {}
319 filterDict = {}
320 filterDict.setdefault(dirName)
320 filterDict.setdefault(dirName)
321 filterDict[dirName] = filter_files
321 filterDict[dirName] = filter_files
322 return filterDict
322 return filterDict
323
323
324 def __getFilenameList(self, fileListInKeys, dirList):
324 def __getFilenameList(self, fileListInKeys, dirList):
325 for value in fileListInKeys:
325 for value in fileListInKeys:
326 dirName = list(value.keys())[0]
326 dirName = list(value.keys())[0]
327 for file in value[dirName]:
327 for file in value[dirName]:
328 filename = os.path.join(dirName, file)
328 filename = os.path.join(dirName, file)
329 self.filenameList.append(filename)
329 self.filenameList.append(filename)
330
330
331
331
332 def __selectDataForTimes(self, online=False):
332 def __selectDataForTimes(self, online=False):
333 #aun no esta implementado el filtro for tiempo
333 #aun no esta implementado el filtro for tiempo
334 if not(self.status):
334 if not(self.status):
335 return None
335 return None
336
336
337 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
337 dirList = [os.path.join(self.path,x) for x in self.dirnameList]
338
338
339 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
339 fileListInKeys = [self.__filterByGlob1(x) for x in dirList]
340
340
341 self.__getFilenameList(fileListInKeys, dirList)
341 self.__getFilenameList(fileListInKeys, dirList)
342 if not(online):
342 if not(online):
343 #filtro por tiempo
343 #filtro por tiempo
344 if not(self.all):
344 if not(self.all):
345 self.__getTimeFromData()
345 self.__getTimeFromData()
346
346
347 if len(self.filenameList)>0:
347 if len(self.filenameList)>0:
348 self.status = 1
348 self.status = 1
349 self.filenameList.sort()
349 self.filenameList.sort()
350 else:
350 else:
351 self.status = 0
351 self.status = 0
352 return None
352 return None
353
353
354 else:
354 else:
355 #get the last file - 1
355 #get the last file - 1
356 self.filenameList = [self.filenameList[-2]]
356 self.filenameList = [self.filenameList[-2]]
357 new_dirnameList = []
357 new_dirnameList = []
358 for dirname in self.dirnameList:
358 for dirname in self.dirnameList:
359 junk = numpy.array([dirname in x for x in self.filenameList])
359 junk = numpy.array([dirname in x for x in self.filenameList])
360 junk_sum = junk.sum()
360 junk_sum = junk.sum()
361 if junk_sum > 0:
361 if junk_sum > 0:
362 new_dirnameList.append(dirname)
362 new_dirnameList.append(dirname)
363 self.dirnameList = new_dirnameList
363 self.dirnameList = new_dirnameList
364 return 1
364 return 1
365
365
366 def searchFilesOnLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0),
366 def searchFilesOnLine(self, path, startDate, endDate, startTime=datetime.time(0,0,0),
367 endTime=datetime.time(23,59,59),walk=True):
367 endTime=datetime.time(23,59,59),walk=True):
368
368
369 if endDate ==None:
369 if endDate ==None:
370 startDate = datetime.datetime.utcnow().date()
370 startDate = datetime.datetime.utcnow().date()
371 endDate = datetime.datetime.utcnow().date()
371 endDate = datetime.datetime.utcnow().date()
372
372
373 self.__setParameters(path=path, startDate=startDate, endDate=endDate,startTime = startTime,endTime=endTime, walk=walk)
373 self.__setParameters(path=path, startDate=startDate, endDate=endDate,startTime = startTime,endTime=endTime, walk=walk)
374
374
375 self.__checkPath()
375 self.__checkPath()
376
376
377 self.__findDataForDates(online=True)
377 self.__findDataForDates(online=True)
378
378
379 self.dirnameList = [self.dirnameList[-1]]
379 self.dirnameList = [self.dirnameList[-1]]
380
380
381 self.__selectDataForTimes(online=True)
381 self.__selectDataForTimes(online=True)
382
382
383 return
383 return
384
384
385
385
386 def searchFilesOffLine(self,
386 def searchFilesOffLine(self,
387 path,
387 path,
388 startDate,
388 startDate,
389 endDate,
389 endDate,
390 startTime=datetime.time(0,0,0),
390 startTime=datetime.time(0,0,0),
391 endTime=datetime.time(23,59,59),
391 endTime=datetime.time(23,59,59),
392 walk=True):
392 walk=True):
393
393
394 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
394 self.__setParameters(path, startDate, endDate, startTime, endTime, walk)
395
395
396 self.__checkPath()
396 self.__checkPath()
397
397
398 self.__findDataForDates()
398 self.__findDataForDates()
399
399
400 self.__selectDataForTimes()
400 self.__selectDataForTimes()
401
401
402 for i in range(len(self.filenameList)):
402 for i in range(len(self.filenameList)):
403 print("%s" %(self.filenameList[i]))
403 print("%s" %(self.filenameList[i]))
404
404
405 return
405 return
406
406
407 def __setNextFileOffline(self):
407 def __setNextFileOffline(self):
408
408
409 try:
409 try:
410 self.filename = self.filenameList[self.fileIndex]
410 self.filename = self.filenameList[self.fileIndex]
411 self.amisrFilePointer = h5py.File(self.filename,'r')
411 self.amisrFilePointer = h5py.File(self.filename,'r')
412 self.fileIndex += 1
412 self.fileIndex += 1
413 except:
413 except:
414 self.flagNoMoreFiles = 1
414 self.flagNoMoreFiles = 1
415 print("No more Files")
415 print("No more Files")
416 return 0
416 return 0
417
417
418 self.flagIsNewFile = 1
418 self.flagIsNewFile = 1
419 print("Setting the file: %s"%self.filename)
419 print("Setting the file: %s"%self.filename)
420
420
421 return 1
421 return 1
422
422
423
423
424 def __setNextFileOnline(self):
424 def __setNextFileOnline(self):
425 filename = self.filenameList[0]
425 filename = self.filenameList[0]
426 if self.__filename_online != None:
426 if self.__filename_online != None:
427 self.__selectDataForTimes(online=True)
427 self.__selectDataForTimes(online=True)
428 filename = self.filenameList[0]
428 filename = self.filenameList[0]
429 wait = 0
429 wait = 0
430 self.__waitForNewFile=300 ## DEBUG:
430 self.__waitForNewFile=300 ## DEBUG:
431 while self.__filename_online == filename:
431 while self.__filename_online == filename:
432 print('waiting %d seconds to get a new file...'%(self.__waitForNewFile))
432 print('waiting %d seconds to get a new file...'%(self.__waitForNewFile))
433 if wait == 5:
433 if wait == 5:
434 self.flagNoMoreFiles = 1
434 self.flagNoMoreFiles = 1
435 return 0
435 return 0
436 sleep(self.__waitForNewFile)
436 sleep(self.__waitForNewFile)
437 self.__selectDataForTimes(online=True)
437 self.__selectDataForTimes(online=True)
438 filename = self.filenameList[0]
438 filename = self.filenameList[0]
439 wait += 1
439 wait += 1
440
440
441 self.__filename_online = filename
441 self.__filename_online = filename
442
442
443 self.amisrFilePointer = h5py.File(filename,'r')
443 self.amisrFilePointer = h5py.File(filename,'r')
444 self.flagIsNewFile = 1
444 self.flagIsNewFile = 1
445 self.filename = filename
445 self.filename = filename
446 print("Setting the file: %s"%self.filename)
446 print("Setting the file: %s"%self.filename)
447 return 1
447 return 1
448
448
449
449
450 def readData(self):
450 def readData(self):
451 buffer = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
451 buffer = self.amisrFilePointer.get('Raw11/Data/Samples/Data')
452 re = buffer[:,:,:,0]
452 re = buffer[:,:,:,0]
453 im = buffer[:,:,:,1]
453 im = buffer[:,:,:,1]
454 dataset = re + im*1j
454 dataset = re + im*1j
455
455
456 self.radacTime = self.amisrFilePointer.get('Raw11/Data/RadacHeader/RadacTime')
456 self.radacTime = self.amisrFilePointer.get('Raw11/Data/RadacHeader/RadacTime')
457 timeset = self.radacTime[:,0]
457 timeset = self.radacTime[:,0]
458
458
459 return dataset,timeset
459 return dataset,timeset
460
460
461 def reshapeData(self):
461 def reshapeData(self):
462 #self.beamCodeByPulse, self.beamCode, self.nblocks, self.nprofiles, self.nsa,
462 #self.beamCodeByPulse, self.beamCode, self.nblocks, self.nprofiles, self.nsa,
463 channels = self.beamCodeByPulse[0,:]
463 channels = self.beamCodeByPulse[0,:]
464 nchan = self.nchannels
464 nchan = self.nchannels
465 #self.newProfiles = self.nprofiles/nchan #must be defined on filljroheader
465 #self.newProfiles = self.nprofiles/nchan #must be defined on filljroheader
466 nblocks = self.nblocks
466 nblocks = self.nblocks
467 nsamples = self.nsa
467 nsamples = self.nsa
468
468
469 #Dimensions : nChannels, nProfiles, nSamples
469 #Dimensions : nChannels, nProfiles, nSamples
470 new_block = numpy.empty((nblocks, nchan, numpy.int_(self.newProfiles), nsamples), dtype="complex64")
470 new_block = numpy.empty((nblocks, nchan, numpy.int_(self.newProfiles), nsamples), dtype="complex64")
471 ############################################
471 ############################################
472
472
473 for thisChannel in range(nchan):
473 for thisChannel in range(nchan):
474 new_block[:,thisChannel,:,:] = self.dataset[:,numpy.where(channels==self.beamCode[thisChannel])[0],:]
474 new_block[:,thisChannel,:,:] = self.dataset[:,numpy.where(channels==self.beamCode[thisChannel])[0],:]
475
475
476
476
477 new_block = numpy.transpose(new_block, (1,0,2,3))
477 new_block = numpy.transpose(new_block, (1,0,2,3))
478 new_block = numpy.reshape(new_block, (nchan,-1, nsamples))
478 new_block = numpy.reshape(new_block, (nchan,-1, nsamples))
479
479
480 return new_block
480 return new_block
481
481
482 def updateIndexes(self):
482 def updateIndexes(self):
483
483
484 pass
484 pass
485
485
486 def fillJROHeader(self):
486 def fillJROHeader(self):
487
487
488 #fill radar controller header
488 #fill radar controller header
489 self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm,
489 self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm,
490 txA=self.__txA,
490 txA=self.__txA,
491 txB=0,
491 txB=0,
492 nWindows=1,
492 nWindows=1,
493 nHeights=self.__nSamples,
493 nHeights=self.__nSamples,
494 firstHeight=self.__firstHeight,
494 firstHeight=self.__firstHeight,
495 deltaHeight=self.__deltaHeight,
495 deltaHeight=self.__deltaHeight,
496 codeType=self.__codeType,
496 codeType=self.__codeType,
497 nCode=self.__nCode, nBaud=self.__nBaud,
497 nCode=self.__nCode, nBaud=self.__nBaud,
498 code = self.__code,
498 code = self.__code,
499 fClock=1)
499 fClock=1)
500
500
501 #fill system header
501 #fill system header
502 self.dataOut.systemHeaderObj = SystemHeader(nSamples=self.__nSamples,
502 self.dataOut.systemHeaderObj = SystemHeader(nSamples=self.__nSamples,
503 nProfiles=self.newProfiles,
503 nProfiles=self.newProfiles,
504 nChannels=len(self.__channelList),
504 nChannels=len(self.__channelList),
505 adcResolution=14,
505 adcResolution=14,
506 pciDioBusWidth=32)
506 pciDioBusWidth=32)
507
507
508 self.dataOut.type = "Voltage"
508 self.dataOut.type = "Voltage"
509 self.dataOut.data = None
509 self.dataOut.data = None
510 self.dataOut.dtype = numpy.dtype([('real','<i8'),('imag','<i8')])
510 self.dataOut.dtype = numpy.dtype([('real','<i8'),('imag','<i8')])
511 # self.dataOut.nChannels = 0
511 # self.dataOut.nChannels = 0
512
512
513 # self.dataOut.nHeights = 0
513 # self.dataOut.nHeights = 0
514
514
515 self.dataOut.nProfiles = self.newProfiles*self.nblocks
515 self.dataOut.nProfiles = self.newProfiles*self.nblocks
516 #self.dataOut.heightList = self.__firstHeigth + numpy.arange(self.__nSamples, dtype = numpy.float)*self.__deltaHeigth
516 #self.dataOut.heightList = self.__firstHeigth + numpy.arange(self.__nSamples, dtype = numpy.float)*self.__deltaHeigth
517 ranges = numpy.reshape(self.rangeFromFile.value,(-1))
517 ranges = numpy.reshape(self.rangeFromFile.value,(-1))
518 self.dataOut.heightList = ranges/1000.0 #km
518 self.dataOut.heightList = ranges/1000.0 #km
519 self.dataOut.channelList = self.__channelList
519 self.dataOut.channelList = self.__channelList
520 self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights
520 self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights
521
521
522 # self.dataOut.channelIndexList = None
522 # self.dataOut.channelIndexList = None
523
523
524
524
525 self.dataOut.azimuthList = numpy.array(self.azimuthList)
525 self.dataOut.azimuthList = numpy.array(self.azimuthList)
526 self.dataOut.elevationList = numpy.array(self.elevationList)
526 self.dataOut.elevationList = numpy.array(self.elevationList)
527 self.dataOut.codeList = numpy.array(self.beamCode)
527 self.dataOut.codeList = numpy.array(self.beamCode)
528 #print(self.dataOut.elevationList)
528 #print(self.dataOut.elevationList)
529 self.dataOut.flagNoData = True
529 self.dataOut.flagNoData = True
530
530
531 #Set to TRUE if the data is discontinuous
531 #Set to TRUE if the data is discontinuous
532 self.dataOut.flagDiscontinuousBlock = False
532 self.dataOut.flagDiscontinuousBlock = False
533
533
534 self.dataOut.utctime = None
534 self.dataOut.utctime = None
535
535
536 #self.dataOut.timeZone = -5 #self.__timezone/60 #timezone like jroheader, difference in minutes between UTC and localtime
536 #self.dataOut.timeZone = -5 #self.__timezone/60 #timezone like jroheader, difference in minutes between UTC and localtime
537 if self.timezone == 'lt':
537 if self.timezone == 'lt':
538 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
538 self.dataOut.timeZone = time.timezone / 60. #get the timezone in minutes
539 else:
539 else:
540 self.dataOut.timeZone = 0 #by default time is UTC
540 self.dataOut.timeZone = 0 #by default time is UTC
541
541
542 self.dataOut.dstFlag = 0
542 self.dataOut.dstFlag = 0
543 self.dataOut.errorCount = 0
543 self.dataOut.errorCount = 0
544 self.dataOut.nCohInt = 1
544 self.dataOut.nCohInt = 1
545 self.dataOut.flagDecodeData = False #asumo que la data esta decodificada
545 self.dataOut.flagDecodeData = False #asumo que la data esta decodificada
546 self.dataOut.flagDeflipData = False #asumo que la data esta sin flip
546 self.dataOut.flagDeflipData = False #asumo que la data esta sin flip
547 self.dataOut.flagShiftFFT = False
547 self.dataOut.flagShiftFFT = False
548 self.dataOut.ippSeconds = self.ippSeconds
548 self.dataOut.ippSeconds = self.ippSeconds
549
549
550 #Time interval between profiles
550 #Time interval between profiles
551 #self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
551 #self.dataOut.timeInterval = self.dataOut.ippSeconds * self.dataOut.nCohInt
552
552
553 self.dataOut.frequency = self.__frequency
553 self.dataOut.frequency = self.__frequency
554 self.dataOut.realtime = self.online
554 self.dataOut.realtime = self.online
555 pass
555 pass
556
556
557 def readNextFile(self,online=False):
557 def readNextFile(self,online=False):
558
558
559 if not(online):
559 if not(online):
560 newFile = self.__setNextFileOffline()
560 newFile = self.__setNextFileOffline()
561 else:
561 else:
562 newFile = self.__setNextFileOnline()
562 newFile = self.__setNextFileOnline()
563
563
564 if not(newFile):
564 if not(newFile):
565 self.dataOut.error = True
565 self.dataOut.error = True
566 return 0
566 return 0
567
567
568 if not self.readAMISRHeader(self.amisrFilePointer):
568 if not self.readAMISRHeader(self.amisrFilePointer):
569 self.dataOut.error = True
569 self.dataOut.error = True
570 return 0
570 return 0
571
571
572 self.createBuffers()
572 self.createBuffers()
573 self.fillJROHeader()
573 self.fillJROHeader()
574
574
575 #self.__firstFile = False
575 #self.__firstFile = False
576
576
577
577
578
578
579 self.dataset,self.timeset = self.readData()
579 self.dataset,self.timeset = self.readData()
580
580
581 if self.endDate!=None:
581 if self.endDate!=None:
582 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
582 endDateTime_Reader = datetime.datetime.combine(self.endDate,self.endTime)
583 time_str = self.amisrFilePointer.get('Time/RadacTimeString')
583 time_str = self.amisrFilePointer.get('Time/RadacTimeString')
584 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
584 startDateTimeStr_File = time_str[0][0].decode('UTF-8').split('.')[0]
585 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
585 junk = time.strptime(startDateTimeStr_File, '%Y-%m-%d %H:%M:%S')
586 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
586 startDateTime_File = datetime.datetime(junk.tm_year,junk.tm_mon,junk.tm_mday,junk.tm_hour, junk.tm_min, junk.tm_sec)
587 if self.timezone == 'lt':
587 if self.timezone == 'lt':
588 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
588 startDateTime_File = startDateTime_File - datetime.timedelta(minutes = 300)
589 if (startDateTime_File>endDateTime_Reader):
589 if (startDateTime_File>endDateTime_Reader):
590 return 0
590 return 0
591
591
592 self.jrodataset = self.reshapeData()
592 self.jrodataset = self.reshapeData()
593 #----self.updateIndexes()
593 #----self.updateIndexes()
594 self.profileIndex = 0
594 self.profileIndex = 0
595
595
596 return 1
596 return 1
597
597
598
598
599 def __hasNotDataInBuffer(self):
599 def __hasNotDataInBuffer(self):
600 if self.profileIndex >= (self.newProfiles*self.nblocks):
600 if self.profileIndex >= (self.newProfiles*self.nblocks):
601 return 1
601 return 1
602 return 0
602 return 0
603
603
604
604
605 def getData(self):
605 def getData(self):
606
606
607 if self.flagNoMoreFiles:
607 if self.flagNoMoreFiles:
608 self.dataOut.flagNoData = True
608 self.dataOut.flagNoData = True
609 return 0
609 return 0
610
610
611 if self.__hasNotDataInBuffer():
611 if self.__hasNotDataInBuffer():
612 if not (self.readNextFile(self.online)):
612 if not (self.readNextFile(self.online)):
613 return 0
613 return 0
614
614
615
615
616 if self.dataset is None: # setear esta condicion cuando no hayan datos por leer
616 if self.dataset is None: # setear esta condicion cuando no hayan datos por leer
617 self.dataOut.flagNoData = True
617 self.dataOut.flagNoData = True
618 return 0
618 return 0
619
619
620 #self.dataOut.data = numpy.reshape(self.jrodataset[self.profileIndex,:],(1,-1))
620 #self.dataOut.data = numpy.reshape(self.jrodataset[self.profileIndex,:],(1,-1))
621
621
622 self.dataOut.data = self.jrodataset[:,self.profileIndex,:]
622 self.dataOut.data = self.jrodataset[:,self.profileIndex,:]
623
623
624 #print("R_t",self.timeset)
624 #print("R_t",self.timeset)
625
625
626 #self.dataOut.utctime = self.jrotimeset[self.profileIndex]
626 #self.dataOut.utctime = self.jrotimeset[self.profileIndex]
627 #verificar basic header de jro data y ver si es compatible con este valor
627 #verificar basic header de jro data y ver si es compatible con este valor
628 #self.dataOut.utctime = self.timeset + (self.profileIndex * self.ippSeconds * self.nchannels)
628 #self.dataOut.utctime = self.timeset + (self.profileIndex * self.ippSeconds * self.nchannels)
629 indexprof = numpy.mod(self.profileIndex, self.newProfiles)
629 indexprof = numpy.mod(self.profileIndex, self.newProfiles)
630 indexblock = self.profileIndex/self.newProfiles
630 indexblock = self.profileIndex/self.newProfiles
631 #print (indexblock, indexprof)
631 #print (indexblock, indexprof)
632 diffUTC = 1.8e4 #UTC diference from peru in seconds --Joab
632 diffUTC = 1.8e4 #UTC diference from peru in seconds --Joab
633 diffUTC = 0
633 diffUTC = 0
634 t_comp = (indexprof * self.ippSeconds * self.nchannels) + diffUTC #
634 t_comp = (indexprof * self.ippSeconds * self.nchannels) + diffUTC #
635
635
636 #print("utc :",indexblock," __ ",t_comp)
636 #print("utc :",indexblock," __ ",t_comp)
637 #print(numpy.shape(self.timeset))
637 #print(numpy.shape(self.timeset))
638 self.dataOut.utctime = self.timeset[numpy.int_(indexblock)] + t_comp
638 self.dataOut.utctime = self.timeset[numpy.int_(indexblock)] + t_comp
639 #self.dataOut.utctime = self.timeset[self.profileIndex] + t_comp
639 #self.dataOut.utctime = self.timeset[self.profileIndex] + t_comp
640 #print(self.dataOut.utctime)
640 #print(self.dataOut.utctime)
641 self.dataOut.profileIndex = self.profileIndex
641 self.dataOut.profileIndex = self.profileIndex
642 #print("N profile:",self.profileIndex,self.newProfiles,self.nblocks,self.dataOut.utctime)
642 #print("N profile:",self.profileIndex,self.newProfiles,self.nblocks,self.dataOut.utctime)
643 self.dataOut.flagNoData = False
643 self.dataOut.flagNoData = False
644 # if indexprof == 0:
644 # if indexprof == 0:
645 # print self.dataOut.utctime
645 # print self.dataOut.utctime
646
646
647 self.profileIndex += 1
647 self.profileIndex += 1
648
648
649 #return self.dataOut.data
649 return self.dataOut.data
650
650
651
651
652 def run(self, **kwargs):
652 def run(self, **kwargs):
653 '''
653 '''
654 This method will be called many times so here you should put all your code
654 This method will be called many times so here you should put all your code
655 '''
655 '''
656 #print("running kamisr")
656 #print("running kamisr")
657 if not self.isConfig:
657 if not self.isConfig:
658 self.setup(**kwargs)
658 self.setup(**kwargs)
659 self.isConfig = True
659 self.isConfig = True
660
660
661 self.getData()
661 self.getData()
662 #return(self.dataOut.data)
663 return(self.dataOut)
@@ -1,626 +1,651
1 import os
1 import os
2 import time
2 import time
3 import datetime
3 import datetime
4
4
5 import numpy
5 import numpy
6 import h5py
6 import h5py
7
7
8 import schainpy.admin
8 import schainpy.admin
9 from schainpy.model.data.jrodata import *
9 from schainpy.model.data.jrodata import *
10 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
10 from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator
11 from schainpy.model.io.jroIO_base import *
11 from schainpy.model.io.jroIO_base import *
12 from schainpy.utils import log
12 from schainpy.utils import log
13
13
14
14
15 class HDFReader(Reader, ProcessingUnit):
15 class HDFReader(Reader, ProcessingUnit):
16 """Processing unit to read HDF5 format files
16 """Processing unit to read HDF5 format files
17
17
18 This unit reads HDF5 files created with `HDFWriter` operation contains
18 This unit reads HDF5 files created with `HDFWriter` operation contains
19 by default two groups Data and Metadata all variables would be saved as `dataOut`
19 by default two groups Data and Metadata all variables would be saved as `dataOut`
20 attributes.
20 attributes.
21 It is possible to read any HDF5 file by given the structure in the `description`
21 It is possible to read any HDF5 file by given the structure in the `description`
22 parameter, also you can add extra values to metadata with the parameter `extras`.
22 parameter, also you can add extra values to metadata with the parameter `extras`.
23
23
24 Parameters:
24 Parameters:
25 -----------
25 -----------
26 path : str
26 path : str
27 Path where files are located.
27 Path where files are located.
28 startDate : date
28 startDate : date
29 Start date of the files
29 Start date of the files
30 endDate : list
30 endDate : list
31 End date of the files
31 End date of the files
32 startTime : time
32 startTime : time
33 Start time of the files
33 Start time of the files
34 endTime : time
34 endTime : time
35 End time of the files
35 End time of the files
36 description : dict, optional
36 description : dict, optional
37 Dictionary with the description of the HDF5 file
37 Dictionary with the description of the HDF5 file
38 extras : dict, optional
38 extras : dict, optional
39 Dictionary with extra metadata to be be added to `dataOut`
39 Dictionary with extra metadata to be be added to `dataOut`
40
40
41 Examples
41 Examples
42 --------
42 --------
43
43
44 desc = {
44 desc = {
45 'Data': {
45 'Data': {
46 'data_output': ['u', 'v', 'w'],
46 'data_output': ['u', 'v', 'w'],
47 'utctime': 'timestamps',
47 'utctime': 'timestamps',
48 } ,
48 } ,
49 'Metadata': {
49 'Metadata': {
50 'heightList': 'heights'
50 'heightList': 'heights'
51 }
51 }
52 }
52 }
53
53
54 desc = {
54 desc = {
55 'Data': {
55 'Data': {
56 'data_output': 'winds',
56 'data_output': 'winds',
57 'utctime': 'timestamps'
57 'utctime': 'timestamps'
58 },
58 },
59 'Metadata': {
59 'Metadata': {
60 'heightList': 'heights'
60 'heightList': 'heights'
61 }
61 }
62 }
62 }
63
63
64 extras = {
64 extras = {
65 'timeZone': 300
65 'timeZone': 300
66 }
66 }
67
67
68 reader = project.addReadUnit(
68 reader = project.addReadUnit(
69 name='HDFReader',
69 name='HDFReader',
70 path='/path/to/files',
70 path='/path/to/files',
71 startDate='2019/01/01',
71 startDate='2019/01/01',
72 endDate='2019/01/31',
72 endDate='2019/01/31',
73 startTime='00:00:00',
73 startTime='00:00:00',
74 endTime='23:59:59',
74 endTime='23:59:59',
75 # description=json.dumps(desc),
75 # description=json.dumps(desc),
76 # extras=json.dumps(extras),
76 # extras=json.dumps(extras),
77 )
77 )
78
78
79 """
79 """
80
80
81 __attrs__ = ['path', 'startDate', 'endDate', 'startTime', 'endTime', 'description', 'extras']
81 __attrs__ = ['path', 'startDate', 'endDate', 'startTime', 'endTime', 'description', 'extras']
82
82
83 def __init__(self):
83 def __init__(self):
84 ProcessingUnit.__init__(self)
84 ProcessingUnit.__init__(self)
85 self.dataOut = Parameters()
85 self.dataOut = Parameters()
86 self.ext = ".hdf5"
86 self.ext = ".hdf5"
87 self.optchar = "D"
87 self.optchar = "D"
88 self.meta = {}
88 self.meta = {}
89 self.data = {}
89 self.data = {}
90 self.open_file = h5py.File
90 self.open_file = h5py.File
91 self.open_mode = 'r'
91 self.open_mode = 'r'
92 self.description = {}
92 self.description = {}
93 self.extras = {}
93 self.extras = {}
94 self.filefmt = "*%Y%j***"
94 self.filefmt = "*%Y%j***"
95 self.folderfmt = "*%Y%j"
95 self.folderfmt = "*%Y%j"
96 self.utcoffset = 0
96 self.utcoffset = 0
97
97
98 def setup(self, **kwargs):
98 def setup(self, **kwargs):
99
99
100 self.set_kwargs(**kwargs)
100 self.set_kwargs(**kwargs)
101 if not self.ext.startswith('.'):
101 if not self.ext.startswith('.'):
102 self.ext = '.{}'.format(self.ext)
102 self.ext = '.{}'.format(self.ext)
103
103
104 if self.online:
104 if self.online:
105 log.log("Searching files in online mode...", self.name)
105 log.log("Searching files in online mode...", self.name)
106
106
107 for nTries in range(self.nTries):
107 for nTries in range(self.nTries):
108 fullpath = self.searchFilesOnLine(self.path, self.startDate,
108 fullpath = self.searchFilesOnLine(self.path, self.startDate,
109 self.endDate, self.expLabel, self.ext, self.walk,
109 self.endDate, self.expLabel, self.ext, self.walk,
110 self.filefmt, self.folderfmt)
110 self.filefmt, self.folderfmt)
111 pathname, filename = os.path.split(fullpath)
112 print(pathname,filename)
111 try:
113 try:
112 fullpath = next(fullpath)
114 fullpath = next(fullpath)
115
113 except:
116 except:
114 fullpath = None
117 fullpath = None
115
118
116 if fullpath:
119 if fullpath:
117 break
120 break
118
121
119 log.warning(
122 log.warning(
120 'Waiting {} sec for a valid file in {}: try {} ...'.format(
123 'Waiting {} sec for a valid file in {}: try {} ...'.format(
121 self.delay, self.path, nTries + 1),
124 self.delay, self.path, nTries + 1),
122 self.name)
125 self.name)
123 time.sleep(self.delay)
126 time.sleep(self.delay)
124
127
125 if not(fullpath):
128 if not(fullpath):
126 raise schainpy.admin.SchainError(
129 raise schainpy.admin.SchainError(
127 'There isn\'t any valid file in {}'.format(self.path))
130 'There isn\'t any valid file in {}'.format(self.path))
128
131
129 pathname, filename = os.path.split(fullpath)
132 pathname, filename = os.path.split(fullpath)
130 self.year = int(filename[1:5])
133 self.year = int(filename[1:5])
131 self.doy = int(filename[5:8])
134 self.doy = int(filename[5:8])
132 self.set = int(filename[8:11]) - 1
135 self.set = int(filename[8:11]) - 1
133 else:
136 else:
134 log.log("Searching files in {}".format(self.path), self.name)
137 log.log("Searching files in {}".format(self.path), self.name)
135 self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
138 self.filenameList = self.searchFilesOffLine(self.path, self.startDate,
136 self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt)
139 self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt)
137
140
138 self.setNextFile()
141 self.setNextFile()
139
142
140 return
143 return
141
144
145
142 def readFirstHeader(self):
146 def readFirstHeader(self):
143 '''Read metadata and data'''
147 '''Read metadata and data'''
144
148
145 self.__readMetadata()
149 self.__readMetadata()
146 self.__readData()
150 self.__readData()
147 self.__setBlockList()
151 self.__setBlockList()
148
152
149 if 'type' in self.meta:
153 if 'type' in self.meta:
150 self.dataOut = eval(self.meta['type'])()
154 self.dataOut = eval(self.meta['type'])()
151
155
152 for attr in self.meta:
156 for attr in self.meta:
157 print("attr: ", attr)
153 setattr(self.dataOut, attr, self.meta[attr])
158 setattr(self.dataOut, attr, self.meta[attr])
154
159
160
155 self.blockIndex = 0
161 self.blockIndex = 0
156
162
157 return
163 return
158
164
159 def __setBlockList(self):
165 def __setBlockList(self):
160 '''
166 '''
161 Selects the data within the times defined
167 Selects the data within the times defined
162
168
163 self.fp
169 self.fp
164 self.startTime
170 self.startTime
165 self.endTime
171 self.endTime
166 self.blockList
172 self.blockList
167 self.blocksPerFile
173 self.blocksPerFile
168
174
169 '''
175 '''
170
176
171 startTime = self.startTime
177 startTime = self.startTime
172 endTime = self.endTime
178 endTime = self.endTime
173 thisUtcTime = self.data['utctime'] + self.utcoffset
179 thisUtcTime = self.data['utctime'] + self.utcoffset
174 self.interval = numpy.min(thisUtcTime[1:] - thisUtcTime[:-1])
180 self.interval = numpy.min(thisUtcTime[1:] - thisUtcTime[:-1])
175 thisDatetime = datetime.datetime.utcfromtimestamp(thisUtcTime[0])
181 thisDatetime = datetime.datetime.utcfromtimestamp(thisUtcTime[0])
176
182 self.startFileDatetime = thisDatetime
183 print("datee ",self.startFileDatetime)
177 thisDate = thisDatetime.date()
184 thisDate = thisDatetime.date()
178 thisTime = thisDatetime.time()
185 thisTime = thisDatetime.time()
179
186
180 startUtcTime = (datetime.datetime.combine(thisDate, startTime) - datetime.datetime(1970, 1, 1)).total_seconds()
187 startUtcTime = (datetime.datetime.combine(thisDate, startTime) - datetime.datetime(1970, 1, 1)).total_seconds()
181 endUtcTime = (datetime.datetime.combine(thisDate, endTime) - datetime.datetime(1970, 1, 1)).total_seconds()
188 endUtcTime = (datetime.datetime.combine(thisDate, endTime) - datetime.datetime(1970, 1, 1)).total_seconds()
182
189
183 ind = numpy.where(numpy.logical_and(thisUtcTime >= startUtcTime, thisUtcTime < endUtcTime))[0]
190 ind = numpy.where(numpy.logical_and(thisUtcTime >= startUtcTime, thisUtcTime < endUtcTime))[0]
184
191
185 self.blockList = ind
192 self.blockList = ind
186 self.blocksPerFile = len(ind)
193 self.blocksPerFile = len(ind)
194 self.blocksPerFile = len(thisUtcTime)
187 return
195 return
188
196
189 def __readMetadata(self):
197 def __readMetadata(self):
190 '''
198 '''
191 Reads Metadata
199 Reads Metadata
192 '''
200 '''
193
201
194 meta = {}
202 meta = {}
195
203
196 if self.description:
204 if self.description:
197 for key, value in self.description['Metadata'].items():
205 for key, value in self.description['Metadata'].items():
198 meta[key] = self.fp[value][()]
206 meta[key] = self.fp[value][()]
199 else:
207 else:
200 grp = self.fp['Metadata']
208 grp = self.fp['Metadata']
201 for name in grp:
209 for name in grp:
202 meta[name] = grp[name][()]
210 meta[name] = grp[name][()]
203
211
204 if self.extras:
212 if self.extras:
205 for key, value in self.extras.items():
213 for key, value in self.extras.items():
206 meta[key] = value
214 meta[key] = value
207 self.meta = meta
215 self.meta = meta
208
216
209 return
217 return
210
218
219
220
221 def checkForRealPath(self, nextFile, nextDay):
222
223 # print("check FRP")
224 # dt = self.startFileDatetime + datetime.timedelta(1)
225 # filename = '{}.{}{}'.format(self.path, dt.strftime('%Y%m%d'), self.ext)
226 # fullfilename = os.path.join(self.path, filename)
227 # print("check Path ",fullfilename,filename)
228 # if os.path.exists(fullfilename):
229 # return fullfilename, filename
230 # return None, filename
231 return None,None
232
211 def __readData(self):
233 def __readData(self):
212
234
213 data = {}
235 data = {}
214
236
215 if self.description:
237 if self.description:
216 for key, value in self.description['Data'].items():
238 for key, value in self.description['Data'].items():
217 if isinstance(value, str):
239 if isinstance(value, str):
218 if isinstance(self.fp[value], h5py.Dataset):
240 if isinstance(self.fp[value], h5py.Dataset):
219 data[key] = self.fp[value][()]
241 data[key] = self.fp[value][()]
220 elif isinstance(self.fp[value], h5py.Group):
242 elif isinstance(self.fp[value], h5py.Group):
221 array = []
243 array = []
222 for ch in self.fp[value]:
244 for ch in self.fp[value]:
223 array.append(self.fp[value][ch][()])
245 array.append(self.fp[value][ch][()])
224 data[key] = numpy.array(array)
246 data[key] = numpy.array(array)
225 elif isinstance(value, list):
247 elif isinstance(value, list):
226 array = []
248 array = []
227 for ch in value:
249 for ch in value:
228 array.append(self.fp[ch][()])
250 array.append(self.fp[ch][()])
229 data[key] = numpy.array(array)
251 data[key] = numpy.array(array)
230 else:
252 else:
231 grp = self.fp['Data']
253 grp = self.fp['Data']
232 for name in grp:
254 for name in grp:
233 if isinstance(grp[name], h5py.Dataset):
255 if isinstance(grp[name], h5py.Dataset):
234 array = grp[name][()]
256 array = grp[name][()]
235 elif isinstance(grp[name], h5py.Group):
257 elif isinstance(grp[name], h5py.Group):
236 array = []
258 array = []
237 for ch in grp[name]:
259 for ch in grp[name]:
238 array.append(grp[name][ch][()])
260 array.append(grp[name][ch][()])
239 array = numpy.array(array)
261 array = numpy.array(array)
240 else:
262 else:
241 log.warning('Unknown type: {}'.format(name))
263 log.warning('Unknown type: {}'.format(name))
242
264
243 if name in self.description:
265 if name in self.description:
244 key = self.description[name]
266 key = self.description[name]
245 else:
267 else:
246 key = name
268 key = name
247 data[key] = array
269 data[key] = array
248
270
249 self.data = data
271 self.data = data
250 return
272 return
251
273
252 def getData(self):
274 def getData(self):
253
275 if not self.isDateTimeInRange(self.startFileDatetime, self.startDate, self.endDate, self.startTime, self.endTime):
276 self.dataOut.flagNoData = True
277 self.dataOut.error = True
278 return
254 for attr in self.data:
279 for attr in self.data:
255 if self.data[attr].ndim == 1:
280 if self.data[attr].ndim == 1:
256 setattr(self.dataOut, attr, self.data[attr][self.blockIndex])
281 setattr(self.dataOut, attr, self.data[attr][self.blockIndex])
257 else:
282 else:
258 setattr(self.dataOut, attr, self.data[attr][:, self.blockIndex])
283 setattr(self.dataOut, attr, self.data[attr][:, self.blockIndex])
259
284
260 self.dataOut.flagNoData = False
285 self.dataOut.flagNoData = False
261 self.blockIndex += 1
286 self.blockIndex += 1
262
287
263 log.log("Block No. {}/{} -> {}".format(
288 log.log("Block No. {}/{} -> {}".format(
264 self.blockIndex,
289 self.blockIndex,
265 self.blocksPerFile,
290 self.blocksPerFile,
266 self.dataOut.datatime.ctime()), self.name)
291 self.dataOut.datatime.ctime()), self.name)
267
292
268 return
293 return
269
294
270 def run(self, **kwargs):
295 def run(self, **kwargs):
271
296
272 if not(self.isConfig):
297 if not(self.isConfig):
273 self.setup(**kwargs)
298 self.setup(**kwargs)
274 self.isConfig = True
299 self.isConfig = True
275
300
276 if self.blockIndex == self.blocksPerFile:
301 if self.blockIndex == self.blocksPerFile:
277 self.setNextFile()
302 self.setNextFile()
278
303
279 self.getData()
304 self.getData()
280
305
281 return
306 return
282
307
283 @MPDecorator
308 @MPDecorator
284 class HDFWriter(Operation):
309 class HDFWriter(Operation):
285 """Operation to write HDF5 files.
310 """Operation to write HDF5 files.
286
311
287 The HDF5 file contains by default two groups Data and Metadata where
312 The HDF5 file contains by default two groups Data and Metadata where
288 you can save any `dataOut` attribute specified by `dataList` and `metadataList`
313 you can save any `dataOut` attribute specified by `dataList` and `metadataList`
289 parameters, data attributes are normaly time dependent where the metadata
314 parameters, data attributes are normaly time dependent where the metadata
290 are not.
315 are not.
291 It is possible to customize the structure of the HDF5 file with the
316 It is possible to customize the structure of the HDF5 file with the
292 optional description parameter see the examples.
317 optional description parameter see the examples.
293
318
294 Parameters:
319 Parameters:
295 -----------
320 -----------
296 path : str
321 path : str
297 Path where files will be saved.
322 Path where files will be saved.
298 blocksPerFile : int
323 blocksPerFile : int
299 Number of blocks per file
324 Number of blocks per file
300 metadataList : list
325 metadataList : list
301 List of the dataOut attributes that will be saved as metadata
326 List of the dataOut attributes that will be saved as metadata
302 dataList : int
327 dataList : int
303 List of the dataOut attributes that will be saved as data
328 List of the dataOut attributes that will be saved as data
304 setType : bool
329 setType : bool
305 If True the name of the files corresponds to the timestamp of the data
330 If True the name of the files corresponds to the timestamp of the data
306 description : dict, optional
331 description : dict, optional
307 Dictionary with the desired description of the HDF5 file
332 Dictionary with the desired description of the HDF5 file
308
333
309 Examples
334 Examples
310 --------
335 --------
311
336
312 desc = {
337 desc = {
313 'data_output': {'winds': ['z', 'w', 'v']},
338 'data_output': {'winds': ['z', 'w', 'v']},
314 'utctime': 'timestamps',
339 'utctime': 'timestamps',
315 'heightList': 'heights'
340 'heightList': 'heights'
316 }
341 }
317 desc = {
342 desc = {
318 'data_output': ['z', 'w', 'v'],
343 'data_output': ['z', 'w', 'v'],
319 'utctime': 'timestamps',
344 'utctime': 'timestamps',
320 'heightList': 'heights'
345 'heightList': 'heights'
321 }
346 }
322 desc = {
347 desc = {
323 'Data': {
348 'Data': {
324 'data_output': 'winds',
349 'data_output': 'winds',
325 'utctime': 'timestamps'
350 'utctime': 'timestamps'
326 },
351 },
327 'Metadata': {
352 'Metadata': {
328 'heightList': 'heights'
353 'heightList': 'heights'
329 }
354 }
330 }
355 }
331
356
332 writer = proc_unit.addOperation(name='HDFWriter')
357 writer = proc_unit.addOperation(name='HDFWriter')
333 writer.addParameter(name='path', value='/path/to/file')
358 writer.addParameter(name='path', value='/path/to/file')
334 writer.addParameter(name='blocksPerFile', value='32')
359 writer.addParameter(name='blocksPerFile', value='32')
335 writer.addParameter(name='metadataList', value='heightList,timeZone')
360 writer.addParameter(name='metadataList', value='heightList,timeZone')
336 writer.addParameter(name='dataList',value='data_output,utctime')
361 writer.addParameter(name='dataList',value='data_output,utctime')
337 # writer.addParameter(name='description',value=json.dumps(desc))
362 # writer.addParameter(name='description',value=json.dumps(desc))
338
363
339 """
364 """
340
365
341 ext = ".hdf5"
366 ext = ".hdf5"
342 optchar = "D"
367 optchar = "D"
343 filename = None
368 filename = None
344 path = None
369 path = None
345 setFile = None
370 setFile = None
346 fp = None
371 fp = None
347 firsttime = True
372 firsttime = True
348 #Configurations
373 #Configurations
349 blocksPerFile = None
374 blocksPerFile = None
350 blockIndex = None
375 blockIndex = None
351 dataOut = None
376 dataOut = None
352 #Data Arrays
377 #Data Arrays
353 dataList = None
378 dataList = None
354 metadataList = None
379 metadataList = None
355 currentDay = None
380 currentDay = None
356 lastTime = None
381 lastTime = None
357
382
358 def __init__(self):
383 def __init__(self):
359
384
360 Operation.__init__(self)
385 Operation.__init__(self)
361 return
386 return
362
387
363 def setup(self, path=None, blocksPerFile=10, metadataList=None, dataList=None, setType=None, description=None):
388 def setup(self, path=None, blocksPerFile=10, metadataList=None, dataList=None, setType=None, description=None):
364 self.path = path
389 self.path = path
365 self.blocksPerFile = blocksPerFile
390 self.blocksPerFile = blocksPerFile
366 self.metadataList = metadataList
391 self.metadataList = metadataList
367 self.dataList = [s.strip() for s in dataList]
392 self.dataList = [s.strip() for s in dataList]
368 self.setType = setType
393 self.setType = setType
369 self.description = description
394 self.description = description
370
395
371 if self.metadataList is None:
396 if self.metadataList is None:
372 self.metadataList = self.dataOut.metadata_list
397 self.metadataList = self.dataOut.metadata_list
373
398
374 tableList = []
399 tableList = []
375 dsList = []
400 dsList = []
376
401
377 for i in range(len(self.dataList)):
402 for i in range(len(self.dataList)):
378 dsDict = {}
403 dsDict = {}
379 if hasattr(self.dataOut, self.dataList[i]):
404 if hasattr(self.dataOut, self.dataList[i]):
380 dataAux = getattr(self.dataOut, self.dataList[i])
405 dataAux = getattr(self.dataOut, self.dataList[i])
381 dsDict['variable'] = self.dataList[i]
406 dsDict['variable'] = self.dataList[i]
382 else:
407 else:
383 log.warning('Attribute {} not found in dataOut', self.name)
408 log.warning('Attribute {} not found in dataOut', self.name)
384 continue
409 continue
385
410
386 if dataAux is None:
411 if dataAux is None:
387 continue
412 continue
388 elif isinstance(dataAux, (int, float, numpy.integer, numpy.float)):
413 elif isinstance(dataAux, (int, float, numpy.integer, numpy.float)):
389 dsDict['nDim'] = 0
414 dsDict['nDim'] = 0
390 else:
415 else:
391 dsDict['nDim'] = len(dataAux.shape)
416 dsDict['nDim'] = len(dataAux.shape)
392 dsDict['shape'] = dataAux.shape
417 dsDict['shape'] = dataAux.shape
393 dsDict['dsNumber'] = dataAux.shape[0]
418 dsDict['dsNumber'] = dataAux.shape[0]
394 dsDict['dtype'] = dataAux.dtype
419 dsDict['dtype'] = dataAux.dtype
395
420
396 dsList.append(dsDict)
421 dsList.append(dsDict)
397
422
398 self.dsList = dsList
423 self.dsList = dsList
399 self.currentDay = self.dataOut.datatime.date()
424 self.currentDay = self.dataOut.datatime.date()
400
425
401 def timeFlag(self):
426 def timeFlag(self):
402 currentTime = self.dataOut.utctime
427 currentTime = self.dataOut.utctime
403 timeTuple = time.localtime(currentTime)
428 timeTuple = time.localtime(currentTime)
404 dataDay = timeTuple.tm_yday
429 dataDay = timeTuple.tm_yday
405
430
406 if self.lastTime is None:
431 if self.lastTime is None:
407 self.lastTime = currentTime
432 self.lastTime = currentTime
408 self.currentDay = dataDay
433 self.currentDay = dataDay
409 return False
434 return False
410
435
411 timeDiff = currentTime - self.lastTime
436 timeDiff = currentTime - self.lastTime
412
437
413 #Si el dia es diferente o si la diferencia entre un dato y otro supera la hora
438 #Si el dia es diferente o si la diferencia entre un dato y otro supera la hora
414 if dataDay != self.currentDay:
439 if dataDay != self.currentDay:
415 self.currentDay = dataDay
440 self.currentDay = dataDay
416 return True
441 return True
417 elif timeDiff > 3*60*60:
442 elif timeDiff > 3*60*60:
418 self.lastTime = currentTime
443 self.lastTime = currentTime
419 return True
444 return True
420 else:
445 else:
421 self.lastTime = currentTime
446 self.lastTime = currentTime
422 return False
447 return False
423
448
424 def run(self, dataOut, path, blocksPerFile=10, metadataList=None,
449 def run(self, dataOut, path, blocksPerFile=10, metadataList=None,
425 dataList=[], setType=None, description={}):
450 dataList=[], setType=None, description={}):
426
451
427 self.dataOut = dataOut
452 self.dataOut = dataOut
428 if not(self.isConfig):
453 if not(self.isConfig):
429 self.setup(path=path, blocksPerFile=blocksPerFile,
454 self.setup(path=path, blocksPerFile=blocksPerFile,
430 metadataList=metadataList, dataList=dataList,
455 metadataList=metadataList, dataList=dataList,
431 setType=setType, description=description)
456 setType=setType, description=description)
432
457
433 self.isConfig = True
458 self.isConfig = True
434 self.setNextFile()
459 self.setNextFile()
435
460
436 self.putData()
461 self.putData()
437 return
462 return
438
463
439 def setNextFile(self):
464 def setNextFile(self):
440
465
441 ext = self.ext
466 ext = self.ext
442 path = self.path
467 path = self.path
443 setFile = self.setFile
468 setFile = self.setFile
444
469
445 timeTuple = time.localtime(self.dataOut.utctime)
470 timeTuple = time.localtime(self.dataOut.utctime)
446 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
471 subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday)
447 fullpath = os.path.join(path, subfolder)
472 fullpath = os.path.join(path, subfolder)
448
473
449 if os.path.exists(fullpath):
474 if os.path.exists(fullpath):
450 filesList = os.listdir(fullpath)
475 filesList = os.listdir(fullpath)
451 filesList = [k for k in filesList if k.startswith(self.optchar)]
476 filesList = [k for k in filesList if k.startswith(self.optchar)]
452 if len( filesList ) > 0:
477 if len( filesList ) > 0:
453 filesList = sorted(filesList, key=str.lower)
478 filesList = sorted(filesList, key=str.lower)
454 filen = filesList[-1]
479 filen = filesList[-1]
455 # el filename debera tener el siguiente formato
480 # el filename debera tener el siguiente formato
456 # 0 1234 567 89A BCDE (hex)
481 # 0 1234 567 89A BCDE (hex)
457 # x YYYY DDD SSS .ext
482 # x YYYY DDD SSS .ext
458 if isNumber(filen[8:11]):
483 if isNumber(filen[8:11]):
459 setFile = int(filen[8:11]) #inicializo mi contador de seteo al seteo del ultimo file
484 setFile = int(filen[8:11]) #inicializo mi contador de seteo al seteo del ultimo file
460 else:
485 else:
461 setFile = -1
486 setFile = -1
462 else:
487 else:
463 setFile = -1 #inicializo mi contador de seteo
488 setFile = -1 #inicializo mi contador de seteo
464 else:
489 else:
465 os.makedirs(fullpath)
490 os.makedirs(fullpath)
466 setFile = -1 #inicializo mi contador de seteo
491 setFile = -1 #inicializo mi contador de seteo
467
492
468 if self.setType is None:
493 if self.setType is None:
469 setFile += 1
494 setFile += 1
470 file = '%s%4.4d%3.3d%03d%s' % (self.optchar,
495 file = '%s%4.4d%3.3d%03d%s' % (self.optchar,
471 timeTuple.tm_year,
496 timeTuple.tm_year,
472 timeTuple.tm_yday,
497 timeTuple.tm_yday,
473 setFile,
498 setFile,
474 ext )
499 ext )
475 else:
500 else:
476 setFile = timeTuple.tm_hour*60+timeTuple.tm_min
501 setFile = timeTuple.tm_hour*60+timeTuple.tm_min
477 file = '%s%4.4d%3.3d%04d%s' % (self.optchar,
502 file = '%s%4.4d%3.3d%04d%s' % (self.optchar,
478 timeTuple.tm_year,
503 timeTuple.tm_year,
479 timeTuple.tm_yday,
504 timeTuple.tm_yday,
480 setFile,
505 setFile,
481 ext )
506 ext )
482
507
483 self.filename = os.path.join( path, subfolder, file )
508 self.filename = os.path.join( path, subfolder, file )
484
509
485 #Setting HDF5 File
510 #Setting HDF5 File
486 self.fp = h5py.File(self.filename, 'w')
511 self.fp = h5py.File(self.filename, 'w')
487 #write metadata
512 #write metadata
488 self.writeMetadata(self.fp)
513 self.writeMetadata(self.fp)
489 #Write data
514 #Write data
490 self.writeData(self.fp)
515 self.writeData(self.fp)
491
516
492 def getLabel(self, name, x=None):
517 def getLabel(self, name, x=None):
493
518
494 if x is None:
519 if x is None:
495 if 'Data' in self.description:
520 if 'Data' in self.description:
496 data = self.description['Data']
521 data = self.description['Data']
497 if 'Metadata' in self.description:
522 if 'Metadata' in self.description:
498 data.update(self.description['Metadata'])
523 data.update(self.description['Metadata'])
499 else:
524 else:
500 data = self.description
525 data = self.description
501 if name in data:
526 if name in data:
502 if isinstance(data[name], str):
527 if isinstance(data[name], str):
503 return data[name]
528 return data[name]
504 elif isinstance(data[name], list):
529 elif isinstance(data[name], list):
505 return None
530 return None
506 elif isinstance(data[name], dict):
531 elif isinstance(data[name], dict):
507 for key, value in data[name].items():
532 for key, value in data[name].items():
508 return key
533 return key
509 return name
534 return name
510 else:
535 else:
511 if 'Metadata' in self.description:
536 if 'Metadata' in self.description:
512 meta = self.description['Metadata']
537 meta = self.description['Metadata']
513 else:
538 else:
514 meta = self.description
539 meta = self.description
515 if name in meta:
540 if name in meta:
516 if isinstance(meta[name], list):
541 if isinstance(meta[name], list):
517 return meta[name][x]
542 return meta[name][x]
518 elif isinstance(meta[name], dict):
543 elif isinstance(meta[name], dict):
519 for key, value in meta[name].items():
544 for key, value in meta[name].items():
520 return value[x]
545 return value[x]
521 if 'cspc' in name:
546 if 'cspc' in name:
522 return 'pair{:02d}'.format(x)
547 return 'pair{:02d}'.format(x)
523 else:
548 else:
524 return 'channel{:02d}'.format(x)
549 return 'channel{:02d}'.format(x)
525
550
526 def writeMetadata(self, fp):
551 def writeMetadata(self, fp):
527
552
528 if self.description:
553 if self.description:
529 if 'Metadata' in self.description:
554 if 'Metadata' in self.description:
530 grp = fp.create_group('Metadata')
555 grp = fp.create_group('Metadata')
531 else:
556 else:
532 grp = fp
557 grp = fp
533 else:
558 else:
534 grp = fp.create_group('Metadata')
559 grp = fp.create_group('Metadata')
535
560
536 for i in range(len(self.metadataList)):
561 for i in range(len(self.metadataList)):
537 if not hasattr(self.dataOut, self.metadataList[i]):
562 if not hasattr(self.dataOut, self.metadataList[i]):
538 log.warning('Metadata: `{}` not found'.format(self.metadataList[i]), self.name)
563 log.warning('Metadata: `{}` not found'.format(self.metadataList[i]), self.name)
539 continue
564 continue
540 value = getattr(self.dataOut, self.metadataList[i])
565 value = getattr(self.dataOut, self.metadataList[i])
541 if isinstance(value, bool):
566 if isinstance(value, bool):
542 if value is True:
567 if value is True:
543 value = 1
568 value = 1
544 else:
569 else:
545 value = 0
570 value = 0
546 grp.create_dataset(self.getLabel(self.metadataList[i]), data=value)
571 grp.create_dataset(self.getLabel(self.metadataList[i]), data=value)
547 return
572 return
548
573
549 def writeData(self, fp):
574 def writeData(self, fp):
550
575
551 if self.description:
576 if self.description:
552 if 'Data' in self.description:
577 if 'Data' in self.description:
553 grp = fp.create_group('Data')
578 grp = fp.create_group('Data')
554 else:
579 else:
555 grp = fp
580 grp = fp
556 else:
581 else:
557 grp = fp.create_group('Data')
582 grp = fp.create_group('Data')
558
583
559 dtsets = []
584 dtsets = []
560 data = []
585 data = []
561
586
562 for dsInfo in self.dsList:
587 for dsInfo in self.dsList:
563 if dsInfo['nDim'] == 0:
588 if dsInfo['nDim'] == 0:
564 ds = grp.create_dataset(
589 ds = grp.create_dataset(
565 self.getLabel(dsInfo['variable']),
590 self.getLabel(dsInfo['variable']),
566 (self.blocksPerFile, ),
591 (self.blocksPerFile, ),
567 chunks=True,
592 chunks=True,
568 dtype=numpy.float64)
593 dtype=numpy.float64)
569 dtsets.append(ds)
594 dtsets.append(ds)
570 data.append((dsInfo['variable'], -1))
595 data.append((dsInfo['variable'], -1))
571 else:
596 else:
572 label = self.getLabel(dsInfo['variable'])
597 label = self.getLabel(dsInfo['variable'])
573 if label is not None:
598 if label is not None:
574 sgrp = grp.create_group(label)
599 sgrp = grp.create_group(label)
575 else:
600 else:
576 sgrp = grp
601 sgrp = grp
577 for i in range(dsInfo['dsNumber']):
602 for i in range(dsInfo['dsNumber']):
578 ds = sgrp.create_dataset(
603 ds = sgrp.create_dataset(
579 self.getLabel(dsInfo['variable'], i),
604 self.getLabel(dsInfo['variable'], i),
580 (self.blocksPerFile, ) + dsInfo['shape'][1:],
605 (self.blocksPerFile, ) + dsInfo['shape'][1:],
581 chunks=True,
606 chunks=True,
582 dtype=dsInfo['dtype'])
607 dtype=dsInfo['dtype'])
583 dtsets.append(ds)
608 dtsets.append(ds)
584 data.append((dsInfo['variable'], i))
609 data.append((dsInfo['variable'], i))
585 fp.flush()
610 fp.flush()
586
611
587 log.log('Creating file: {}'.format(fp.filename), self.name)
612 log.log('Creating file: {}'.format(fp.filename), self.name)
588
613
589 self.ds = dtsets
614 self.ds = dtsets
590 self.data = data
615 self.data = data
591 self.firsttime = True
616 self.firsttime = True
592 self.blockIndex = 0
617 self.blockIndex = 0
593 return
618 return
594
619
595 def putData(self):
620 def putData(self):
596
621
597 if (self.blockIndex == self.blocksPerFile) or self.timeFlag():
622 if (self.blockIndex == self.blocksPerFile) or self.timeFlag():
598 self.closeFile()
623 self.closeFile()
599 self.setNextFile()
624 self.setNextFile()
600
625
601 for i, ds in enumerate(self.ds):
626 for i, ds in enumerate(self.ds):
602 attr, ch = self.data[i]
627 attr, ch = self.data[i]
603 if ch == -1:
628 if ch == -1:
604 ds[self.blockIndex] = getattr(self.dataOut, attr)
629 ds[self.blockIndex] = getattr(self.dataOut, attr)
605 else:
630 else:
606 ds[self.blockIndex] = getattr(self.dataOut, attr)[ch]
631 ds[self.blockIndex] = getattr(self.dataOut, attr)[ch]
607
632
608 self.fp.flush()
633 self.fp.flush()
609 self.blockIndex += 1
634 self.blockIndex += 1
610 log.log('Block No. {}/{}'.format(self.blockIndex, self.blocksPerFile), self.name)
635 log.log('Block No. {}/{}'.format(self.blockIndex, self.blocksPerFile), self.name)
611
636
612 return
637 return
613
638
614 def closeFile(self):
639 def closeFile(self):
615
640
616 if self.blockIndex != self.blocksPerFile:
641 if self.blockIndex != self.blocksPerFile:
617 for ds in self.ds:
642 for ds in self.ds:
618 ds.resize(self.blockIndex, axis=0)
643 ds.resize(self.blockIndex, axis=0)
619
644
620 if self.fp:
645 if self.fp:
621 self.fp.flush()
646 self.fp.flush()
622 self.fp.close()
647 self.fp.close()
623
648
624 def close(self):
649 def close(self):
625
650
626 self.closeFile()
651 self.closeFile()
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,1411 +1,1411
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
1 # Copyright (c) 2012-2020 Jicamarca Radio Observatory
2 # All rights reserved.
2 # All rights reserved.
3 #
3 #
4 # Distributed under the terms of the BSD 3-clause license.
4 # Distributed under the terms of the BSD 3-clause license.
5 """Spectra processing Unit and operations
5 """Spectra processing Unit and operations
6
6
7 Here you will find the processing unit `SpectraProc` and several operations
7 Here you will find the processing unit `SpectraProc` and several operations
8 to work with Spectra data type
8 to work with Spectra data type
9 """
9 """
10
10
11 import time
11 import time
12 import itertools
12 import itertools
13
13
14 import numpy
14 import numpy
15 import math
15 import math
16
16
17 from schainpy.model.proc.jroproc_base import ProcessingUnit, MPDecorator, Operation
17 from schainpy.model.proc.jroproc_base import ProcessingUnit, MPDecorator, Operation
18 from schainpy.model.data.jrodata import Spectra
18 from schainpy.model.data.jrodata import Spectra
19 from schainpy.model.data.jrodata import hildebrand_sekhon
19 from schainpy.model.data.jrodata import hildebrand_sekhon
20 from schainpy.utils import log
20 from schainpy.utils import log
21
21
22 from scipy.optimize import curve_fit
22 from scipy.optimize import curve_fit
23
23
24
24
25 class SpectraProc(ProcessingUnit):
25 class SpectraProc(ProcessingUnit):
26
26
27 def __init__(self):
27 def __init__(self):
28
28
29 ProcessingUnit.__init__(self)
29 ProcessingUnit.__init__(self)
30
30
31 self.buffer = None
31 self.buffer = None
32 self.firstdatatime = None
32 self.firstdatatime = None
33 self.profIndex = 0
33 self.profIndex = 0
34 self.dataOut = Spectra()
34 self.dataOut = Spectra()
35 self.id_min = None
35 self.id_min = None
36 self.id_max = None
36 self.id_max = None
37 self.setupReq = False #Agregar a todas las unidades de proc
37 self.setupReq = False #Agregar a todas las unidades de proc
38
38
39 def __updateSpecFromVoltage(self):
39 def __updateSpecFromVoltage(self):
40
40
41 self.dataOut.timeZone = self.dataIn.timeZone
41 self.dataOut.timeZone = self.dataIn.timeZone
42 self.dataOut.dstFlag = self.dataIn.dstFlag
42 self.dataOut.dstFlag = self.dataIn.dstFlag
43 self.dataOut.errorCount = self.dataIn.errorCount
43 self.dataOut.errorCount = self.dataIn.errorCount
44 self.dataOut.useLocalTime = self.dataIn.useLocalTime
44 self.dataOut.useLocalTime = self.dataIn.useLocalTime
45 try:
45 try:
46 self.dataOut.processingHeaderObj = self.dataIn.processingHeaderObj.copy()
46 self.dataOut.processingHeaderObj = self.dataIn.processingHeaderObj.copy()
47 except:
47 except:
48 pass
48 pass
49 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
49 self.dataOut.radarControllerHeaderObj = self.dataIn.radarControllerHeaderObj.copy()
50 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
50 self.dataOut.systemHeaderObj = self.dataIn.systemHeaderObj.copy()
51 self.dataOut.channelList = self.dataIn.channelList
51 self.dataOut.channelList = self.dataIn.channelList
52 self.dataOut.heightList = self.dataIn.heightList
52 self.dataOut.heightList = self.dataIn.heightList
53 self.dataOut.dtype = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
53 self.dataOut.dtype = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
54 self.dataOut.nProfiles = self.dataOut.nFFTPoints
54 self.dataOut.nProfiles = self.dataOut.nFFTPoints
55 self.dataOut.flagDiscontinuousBlock = self.dataIn.flagDiscontinuousBlock
55 self.dataOut.flagDiscontinuousBlock = self.dataIn.flagDiscontinuousBlock
56 self.dataOut.utctime = self.firstdatatime
56 self.dataOut.utctime = self.firstdatatime
57 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData
57 self.dataOut.flagDecodeData = self.dataIn.flagDecodeData
58 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData
58 self.dataOut.flagDeflipData = self.dataIn.flagDeflipData
59 self.dataOut.flagShiftFFT = False
59 self.dataOut.flagShiftFFT = False
60 self.dataOut.nCohInt = self.dataIn.nCohInt
60 self.dataOut.nCohInt = self.dataIn.nCohInt
61 self.dataOut.nIncohInt = 1
61 self.dataOut.nIncohInt = 1
62 self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
62 self.dataOut.windowOfFilter = self.dataIn.windowOfFilter
63 self.dataOut.frequency = self.dataIn.frequency
63 self.dataOut.frequency = self.dataIn.frequency
64 self.dataOut.realtime = self.dataIn.realtime
64 self.dataOut.realtime = self.dataIn.realtime
65 self.dataOut.azimuth = self.dataIn.azimuth
65 self.dataOut.azimuth = self.dataIn.azimuth
66 self.dataOut.zenith = self.dataIn.zenith
66 self.dataOut.zenith = self.dataIn.zenith
67 self.dataOut.codeList = self.dataIn.codeList
67 self.dataOut.codeList = self.dataIn.codeList
68 self.dataOut.azimuthList = self.dataIn.azimuthList
68 self.dataOut.azimuthList = self.dataIn.azimuthList
69 self.dataOut.elevationList = self.dataIn.elevationList
69 self.dataOut.elevationList = self.dataIn.elevationList
70
70
71 def __getFft(self):
71 def __getFft(self):
72 """
72 """
73 Convierte valores de Voltaje a Spectra
73 Convierte valores de Voltaje a Spectra
74
74
75 Affected:
75 Affected:
76 self.dataOut.data_spc
76 self.dataOut.data_spc
77 self.dataOut.data_cspc
77 self.dataOut.data_cspc
78 self.dataOut.data_dc
78 self.dataOut.data_dc
79 self.dataOut.heightList
79 self.dataOut.heightList
80 self.profIndex
80 self.profIndex
81 self.buffer
81 self.buffer
82 self.dataOut.flagNoData
82 self.dataOut.flagNoData
83 """
83 """
84 fft_volt = numpy.fft.fft(
84 fft_volt = numpy.fft.fft(
85 self.buffer, n=self.dataOut.nFFTPoints, axis=1)
85 self.buffer, n=self.dataOut.nFFTPoints, axis=1)
86 fft_volt = fft_volt.astype(numpy.dtype('complex'))
86 fft_volt = fft_volt.astype(numpy.dtype('complex'))
87 dc = fft_volt[:, 0, :]
87 dc = fft_volt[:, 0, :]
88
88
89 # calculo de self-spectra
89 # calculo de self-spectra
90 fft_volt = numpy.fft.fftshift(fft_volt, axes=(1,))
90 fft_volt = numpy.fft.fftshift(fft_volt, axes=(1,))
91 spc = fft_volt * numpy.conjugate(fft_volt)
91 spc = fft_volt * numpy.conjugate(fft_volt)
92 spc = spc.real
92 spc = spc.real
93
93
94 blocksize = 0
94 blocksize = 0
95 blocksize += dc.size
95 blocksize += dc.size
96 blocksize += spc.size
96 blocksize += spc.size
97
97
98 cspc = None
98 cspc = None
99 pairIndex = 0
99 pairIndex = 0
100 if self.dataOut.pairsList != None:
100 if self.dataOut.pairsList != None:
101 # calculo de cross-spectra
101 # calculo de cross-spectra
102 cspc = numpy.zeros(
102 cspc = numpy.zeros(
103 (self.dataOut.nPairs, self.dataOut.nFFTPoints, self.dataOut.nHeights), dtype='complex')
103 (self.dataOut.nPairs, self.dataOut.nFFTPoints, self.dataOut.nHeights), dtype='complex')
104 for pair in self.dataOut.pairsList:
104 for pair in self.dataOut.pairsList:
105 if pair[0] not in self.dataOut.channelList:
105 if pair[0] not in self.dataOut.channelList:
106 raise ValueError("Error getting CrossSpectra: pair 0 of %s is not in channelList = %s" % (
106 raise ValueError("Error getting CrossSpectra: pair 0 of %s is not in channelList = %s" % (
107 str(pair), str(self.dataOut.channelList)))
107 str(pair), str(self.dataOut.channelList)))
108 if pair[1] not in self.dataOut.channelList:
108 if pair[1] not in self.dataOut.channelList:
109 raise ValueError("Error getting CrossSpectra: pair 1 of %s is not in channelList = %s" % (
109 raise ValueError("Error getting CrossSpectra: pair 1 of %s is not in channelList = %s" % (
110 str(pair), str(self.dataOut.channelList)))
110 str(pair), str(self.dataOut.channelList)))
111
111
112 cspc[pairIndex, :, :] = fft_volt[pair[0], :, :] * \
112 cspc[pairIndex, :, :] = fft_volt[pair[0], :, :] * \
113 numpy.conjugate(fft_volt[pair[1], :, :])
113 numpy.conjugate(fft_volt[pair[1], :, :])
114 pairIndex += 1
114 pairIndex += 1
115 blocksize += cspc.size
115 blocksize += cspc.size
116
116
117 self.dataOut.data_spc = spc
117 self.dataOut.data_spc = spc
118 self.dataOut.data_cspc = cspc
118 self.dataOut.data_cspc = cspc
119 self.dataOut.data_dc = dc
119 self.dataOut.data_dc = dc
120 self.dataOut.blockSize = blocksize
120 self.dataOut.blockSize = blocksize
121 self.dataOut.flagShiftFFT = False
121 self.dataOut.flagShiftFFT = False
122
122
123 def run(self, nProfiles=None, nFFTPoints=None, pairsList=None, ippFactor=None, shift_fft=False):
123 def run(self, nProfiles=None, nFFTPoints=None, pairsList=None, ippFactor=None, shift_fft=False):
124
124
125 if self.dataIn.type == "Spectra":
125 if self.dataIn.type == "Spectra":
126 self.dataOut.copy(self.dataIn)
126 self.dataOut.copy(self.dataIn)
127 if shift_fft:
127 if shift_fft:
128 #desplaza a la derecha en el eje 2 determinadas posiciones
128 #desplaza a la derecha en el eje 2 determinadas posiciones
129 shift = int(self.dataOut.nFFTPoints/2)
129 shift = int(self.dataOut.nFFTPoints/2)
130 self.dataOut.data_spc = numpy.roll(self.dataOut.data_spc, shift , axis=1)
130 self.dataOut.data_spc = numpy.roll(self.dataOut.data_spc, shift , axis=1)
131
131
132 if self.dataOut.data_cspc is not None:
132 if self.dataOut.data_cspc is not None:
133 #desplaza a la derecha en el eje 2 determinadas posiciones
133 #desplaza a la derecha en el eje 2 determinadas posiciones
134 self.dataOut.data_cspc = numpy.roll(self.dataOut.data_cspc, shift, axis=1)
134 self.dataOut.data_cspc = numpy.roll(self.dataOut.data_cspc, shift, axis=1)
135 if pairsList:
135 if pairsList:
136 self.__selectPairs(pairsList)
136 self.__selectPairs(pairsList)
137
137
138 elif self.dataIn.type == "Voltage":
138 elif self.dataIn.type == "Voltage":
139
139
140 self.dataOut.flagNoData = True
140 self.dataOut.flagNoData = True
141
141
142 if nFFTPoints == None:
142 if nFFTPoints == None:
143 raise ValueError("This SpectraProc.run() need nFFTPoints input variable")
143 raise ValueError("This SpectraProc.run() need nFFTPoints input variable")
144
144
145 if nProfiles == None:
145 if nProfiles == None:
146 nProfiles = nFFTPoints
146 nProfiles = nFFTPoints
147
147
148 if ippFactor == None:
148 if ippFactor == None:
149 self.dataOut.ippFactor = 1
149 self.dataOut.ippFactor = 1
150
150
151 self.dataOut.nFFTPoints = nFFTPoints
151 self.dataOut.nFFTPoints = nFFTPoints
152
152
153 if self.buffer is None:
153 if self.buffer is None:
154 self.buffer = numpy.zeros((self.dataIn.nChannels,
154 self.buffer = numpy.zeros((self.dataIn.nChannels,
155 nProfiles,
155 nProfiles,
156 self.dataIn.nHeights),
156 self.dataIn.nHeights),
157 dtype='complex')
157 dtype='complex')
158
158
159 if self.dataIn.flagDataAsBlock:
159 if self.dataIn.flagDataAsBlock:
160 nVoltProfiles = self.dataIn.data.shape[1]
160 nVoltProfiles = self.dataIn.data.shape[1]
161
161
162 if nVoltProfiles == nProfiles:
162 if nVoltProfiles == nProfiles:
163 self.buffer = self.dataIn.data.copy()
163 self.buffer = self.dataIn.data.copy()
164 self.profIndex = nVoltProfiles
164 self.profIndex = nVoltProfiles
165
165
166 elif nVoltProfiles < nProfiles:
166 elif nVoltProfiles < nProfiles:
167
167
168 if self.profIndex == 0:
168 if self.profIndex == 0:
169 self.id_min = 0
169 self.id_min = 0
170 self.id_max = nVoltProfiles
170 self.id_max = nVoltProfiles
171
171
172 self.buffer[:, self.id_min:self.id_max,
172 self.buffer[:, self.id_min:self.id_max,
173 :] = self.dataIn.data
173 :] = self.dataIn.data
174 self.profIndex += nVoltProfiles
174 self.profIndex += nVoltProfiles
175 self.id_min += nVoltProfiles
175 self.id_min += nVoltProfiles
176 self.id_max += nVoltProfiles
176 self.id_max += nVoltProfiles
177 else:
177 else:
178 raise ValueError("The type object %s has %d profiles, it should just has %d profiles" % (
178 raise ValueError("The type object %s has %d profiles, it should just has %d profiles" % (
179 self.dataIn.type, self.dataIn.data.shape[1], nProfiles))
179 self.dataIn.type, self.dataIn.data.shape[1], nProfiles))
180 self.dataOut.flagNoData = True
180 self.dataOut.flagNoData = True
181 else:
181 else:
182 self.buffer[:, self.profIndex, :] = self.dataIn.data.copy()
182 self.buffer[:, self.profIndex, :] = self.dataIn.data.copy()
183 self.profIndex += 1
183 self.profIndex += 1
184
184
185 if self.firstdatatime == None:
185 if self.firstdatatime == None:
186 self.firstdatatime = self.dataIn.utctime
186 self.firstdatatime = self.dataIn.utctime
187
187
188 if self.profIndex == nProfiles:
188 if self.profIndex == nProfiles:
189 self.__updateSpecFromVoltage()
189 self.__updateSpecFromVoltage()
190 if pairsList == None:
190 if pairsList == None:
191 self.dataOut.pairsList = [pair for pair in itertools.combinations(self.dataOut.channelList, 2)]
191 self.dataOut.pairsList = [pair for pair in itertools.combinations(self.dataOut.channelList, 2)]
192 else:
192 else:
193 self.dataOut.pairsList = pairsList
193 self.dataOut.pairsList = pairsList
194 self.__getFft()
194 self.__getFft()
195 self.dataOut.flagNoData = False
195 self.dataOut.flagNoData = False
196 self.firstdatatime = None
196 self.firstdatatime = None
197 self.profIndex = 0
197 self.profIndex = 0
198 else:
198 else:
199 raise ValueError("The type of input object '%s' is not valid".format(
199 raise ValueError("The type of input object '%s' is not valid".format(
200 self.dataIn.type))
200 self.dataIn.type))
201
201
202 def __selectPairs(self, pairsList):
202 def __selectPairs(self, pairsList):
203
203
204 if not pairsList:
204 if not pairsList:
205 return
205 return
206
206
207 pairs = []
207 pairs = []
208 pairsIndex = []
208 pairsIndex = []
209
209
210 for pair in pairsList:
210 for pair in pairsList:
211 if pair[0] not in self.dataOut.channelList or pair[1] not in self.dataOut.channelList:
211 if pair[0] not in self.dataOut.channelList or pair[1] not in self.dataOut.channelList:
212 continue
212 continue
213 pairs.append(pair)
213 pairs.append(pair)
214 pairsIndex.append(pairs.index(pair))
214 pairsIndex.append(pairs.index(pair))
215
215
216 self.dataOut.data_cspc = self.dataOut.data_cspc[pairsIndex]
216 self.dataOut.data_cspc = self.dataOut.data_cspc[pairsIndex]
217 self.dataOut.pairsList = pairs
217 self.dataOut.pairsList = pairs
218
218
219 return
219 return
220
220
221 def selectFFTs(self, minFFT, maxFFT ):
221 def selectFFTs(self, minFFT, maxFFT ):
222 """
222 """
223 Selecciona un bloque de datos en base a un grupo de valores de puntos FFTs segun el rango
223 Selecciona un bloque de datos en base a un grupo de valores de puntos FFTs segun el rango
224 minFFT<= FFT <= maxFFT
224 minFFT<= FFT <= maxFFT
225 """
225 """
226
226
227 if (minFFT > maxFFT):
227 if (minFFT > maxFFT):
228 raise ValueError("Error selecting heights: Height range (%d,%d) is not valid" % (minFFT, maxFFT))
228 raise ValueError("Error selecting heights: Height range (%d,%d) is not valid" % (minFFT, maxFFT))
229
229
230 if (minFFT < self.dataOut.getFreqRange()[0]):
230 if (minFFT < self.dataOut.getFreqRange()[0]):
231 minFFT = self.dataOut.getFreqRange()[0]
231 minFFT = self.dataOut.getFreqRange()[0]
232
232
233 if (maxFFT > self.dataOut.getFreqRange()[-1]):
233 if (maxFFT > self.dataOut.getFreqRange()[-1]):
234 maxFFT = self.dataOut.getFreqRange()[-1]
234 maxFFT = self.dataOut.getFreqRange()[-1]
235
235
236 minIndex = 0
236 minIndex = 0
237 maxIndex = 0
237 maxIndex = 0
238 FFTs = self.dataOut.getFreqRange()
238 FFTs = self.dataOut.getFreqRange()
239
239
240 inda = numpy.where(FFTs >= minFFT)
240 inda = numpy.where(FFTs >= minFFT)
241 indb = numpy.where(FFTs <= maxFFT)
241 indb = numpy.where(FFTs <= maxFFT)
242
242
243 try:
243 try:
244 minIndex = inda[0][0]
244 minIndex = inda[0][0]
245 except:
245 except:
246 minIndex = 0
246 minIndex = 0
247
247
248 try:
248 try:
249 maxIndex = indb[0][-1]
249 maxIndex = indb[0][-1]
250 except:
250 except:
251 maxIndex = len(FFTs)
251 maxIndex = len(FFTs)
252
252
253 self.selectFFTsByIndex(minIndex, maxIndex)
253 self.selectFFTsByIndex(minIndex, maxIndex)
254
254
255 return 1
255 return 1
256
256
257 def getBeaconSignal(self, tauindex=0, channelindex=0, hei_ref=None):
257 def getBeaconSignal(self, tauindex=0, channelindex=0, hei_ref=None):
258 newheis = numpy.where(
258 newheis = numpy.where(
259 self.dataOut.heightList > self.dataOut.radarControllerHeaderObj.Taus[tauindex])
259 self.dataOut.heightList > self.dataOut.radarControllerHeaderObj.Taus[tauindex])
260
260
261 if hei_ref != None:
261 if hei_ref != None:
262 newheis = numpy.where(self.dataOut.heightList > hei_ref)
262 newheis = numpy.where(self.dataOut.heightList > hei_ref)
263
263
264 minIndex = min(newheis[0])
264 minIndex = min(newheis[0])
265 maxIndex = max(newheis[0])
265 maxIndex = max(newheis[0])
266 data_spc = self.dataOut.data_spc[:, :, minIndex:maxIndex + 1]
266 data_spc = self.dataOut.data_spc[:, :, minIndex:maxIndex + 1]
267 heightList = self.dataOut.heightList[minIndex:maxIndex + 1]
267 heightList = self.dataOut.heightList[minIndex:maxIndex + 1]
268
268
269 # determina indices
269 # determina indices
270 nheis = int(self.dataOut.radarControllerHeaderObj.txB /
270 nheis = int(self.dataOut.radarControllerHeaderObj.txB /
271 (self.dataOut.heightList[1] - self.dataOut.heightList[0]))
271 (self.dataOut.heightList[1] - self.dataOut.heightList[0]))
272 avg_dB = 10 * \
272 avg_dB = 10 * \
273 numpy.log10(numpy.sum(data_spc[channelindex, :, :], axis=0))
273 numpy.log10(numpy.sum(data_spc[channelindex, :, :], axis=0))
274 beacon_dB = numpy.sort(avg_dB)[-nheis:]
274 beacon_dB = numpy.sort(avg_dB)[-nheis:]
275 beacon_heiIndexList = []
275 beacon_heiIndexList = []
276 for val in avg_dB.tolist():
276 for val in avg_dB.tolist():
277 if val >= beacon_dB[0]:
277 if val >= beacon_dB[0]:
278 beacon_heiIndexList.append(avg_dB.tolist().index(val))
278 beacon_heiIndexList.append(avg_dB.tolist().index(val))
279
279
280 #data_spc = data_spc[:,:,beacon_heiIndexList]
280 #data_spc = data_spc[:,:,beacon_heiIndexList]
281 data_cspc = None
281 data_cspc = None
282 if self.dataOut.data_cspc is not None:
282 if self.dataOut.data_cspc is not None:
283 data_cspc = self.dataOut.data_cspc[:, :, minIndex:maxIndex + 1]
283 data_cspc = self.dataOut.data_cspc[:, :, minIndex:maxIndex + 1]
284 #data_cspc = data_cspc[:,:,beacon_heiIndexList]
284 #data_cspc = data_cspc[:,:,beacon_heiIndexList]
285
285
286 data_dc = None
286 data_dc = None
287 if self.dataOut.data_dc is not None:
287 if self.dataOut.data_dc is not None:
288 data_dc = self.dataOut.data_dc[:, minIndex:maxIndex + 1]
288 data_dc = self.dataOut.data_dc[:, minIndex:maxIndex + 1]
289 #data_dc = data_dc[:,beacon_heiIndexList]
289 #data_dc = data_dc[:,beacon_heiIndexList]
290
290
291 self.dataOut.data_spc = data_spc
291 self.dataOut.data_spc = data_spc
292 self.dataOut.data_cspc = data_cspc
292 self.dataOut.data_cspc = data_cspc
293 self.dataOut.data_dc = data_dc
293 self.dataOut.data_dc = data_dc
294 self.dataOut.heightList = heightList
294 self.dataOut.heightList = heightList
295 self.dataOut.beacon_heiIndexList = beacon_heiIndexList
295 self.dataOut.beacon_heiIndexList = beacon_heiIndexList
296
296
297 return 1
297 return 1
298
298
299 def selectFFTsByIndex(self, minIndex, maxIndex):
299 def selectFFTsByIndex(self, minIndex, maxIndex):
300 """
300 """
301
301
302 """
302 """
303
303
304 if (minIndex < 0) or (minIndex > maxIndex):
304 if (minIndex < 0) or (minIndex > maxIndex):
305 raise ValueError("Error selecting heights: Index range (%d,%d) is not valid" % (minIndex, maxIndex))
305 raise ValueError("Error selecting heights: Index range (%d,%d) is not valid" % (minIndex, maxIndex))
306
306
307 if (maxIndex >= self.dataOut.nProfiles):
307 if (maxIndex >= self.dataOut.nProfiles):
308 maxIndex = self.dataOut.nProfiles-1
308 maxIndex = self.dataOut.nProfiles-1
309
309
310 #Spectra
310 #Spectra
311 data_spc = self.dataOut.data_spc[:,minIndex:maxIndex+1,:]
311 data_spc = self.dataOut.data_spc[:,minIndex:maxIndex+1,:]
312
312
313 data_cspc = None
313 data_cspc = None
314 if self.dataOut.data_cspc is not None:
314 if self.dataOut.data_cspc is not None:
315 data_cspc = self.dataOut.data_cspc[:,minIndex:maxIndex+1,:]
315 data_cspc = self.dataOut.data_cspc[:,minIndex:maxIndex+1,:]
316
316
317 data_dc = None
317 data_dc = None
318 if self.dataOut.data_dc is not None:
318 if self.dataOut.data_dc is not None:
319 data_dc = self.dataOut.data_dc[minIndex:maxIndex+1,:]
319 data_dc = self.dataOut.data_dc[minIndex:maxIndex+1,:]
320
320
321 self.dataOut.data_spc = data_spc
321 self.dataOut.data_spc = data_spc
322 self.dataOut.data_cspc = data_cspc
322 self.dataOut.data_cspc = data_cspc
323 self.dataOut.data_dc = data_dc
323 self.dataOut.data_dc = data_dc
324
324
325 self.dataOut.ippSeconds = self.dataOut.ippSeconds*(self.dataOut.nFFTPoints / numpy.shape(data_cspc)[1])
325 self.dataOut.ippSeconds = self.dataOut.ippSeconds*(self.dataOut.nFFTPoints / numpy.shape(data_cspc)[1])
326 self.dataOut.nFFTPoints = numpy.shape(data_cspc)[1]
326 self.dataOut.nFFTPoints = numpy.shape(data_cspc)[1]
327 self.dataOut.profilesPerBlock = numpy.shape(data_cspc)[1]
327 self.dataOut.profilesPerBlock = numpy.shape(data_cspc)[1]
328
328
329 return 1
329 return 1
330
330
331 def getNoise(self, minHei=None, maxHei=None, minVel=None, maxVel=None):
331 def getNoise(self, minHei=None, maxHei=None, minVel=None, maxVel=None):
332 # validacion de rango
332 # validacion de rango
333 if minHei == None:
333 if minHei == None:
334 minHei = self.dataOut.heightList[0]
334 minHei = self.dataOut.heightList[0]
335
335
336 if maxHei == None:
336 if maxHei == None:
337 maxHei = self.dataOut.heightList[-1]
337 maxHei = self.dataOut.heightList[-1]
338
338
339 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
339 if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei):
340 print('minHei: %.2f is out of the heights range' % (minHei))
340 print('minHei: %.2f is out of the heights range' % (minHei))
341 print('minHei is setting to %.2f' % (self.dataOut.heightList[0]))
341 print('minHei is setting to %.2f' % (self.dataOut.heightList[0]))
342 minHei = self.dataOut.heightList[0]
342 minHei = self.dataOut.heightList[0]
343
343
344 if (maxHei > self.dataOut.heightList[-1]) or (maxHei < minHei):
344 if (maxHei > self.dataOut.heightList[-1]) or (maxHei < minHei):
345 print('maxHei: %.2f is out of the heights range' % (maxHei))
345 print('maxHei: %.2f is out of the heights range' % (maxHei))
346 print('maxHei is setting to %.2f' % (self.dataOut.heightList[-1]))
346 print('maxHei is setting to %.2f' % (self.dataOut.heightList[-1]))
347 maxHei = self.dataOut.heightList[-1]
347 maxHei = self.dataOut.heightList[-1]
348
348
349 # validacion de velocidades
349 # validacion de velocidades
350 velrange = self.dataOut.getVelRange(1)
350 velrange = self.dataOut.getVelRange(1)
351
351
352 if minVel == None:
352 if minVel == None:
353 minVel = velrange[0]
353 minVel = velrange[0]
354
354
355 if maxVel == None:
355 if maxVel == None:
356 maxVel = velrange[-1]
356 maxVel = velrange[-1]
357
357
358 if (minVel < velrange[0]) or (minVel > maxVel):
358 if (minVel < velrange[0]) or (minVel > maxVel):
359 print('minVel: %.2f is out of the velocity range' % (minVel))
359 print('minVel: %.2f is out of the velocity range' % (minVel))
360 print('minVel is setting to %.2f' % (velrange[0]))
360 print('minVel is setting to %.2f' % (velrange[0]))
361 minVel = velrange[0]
361 minVel = velrange[0]
362
362
363 if (maxVel > velrange[-1]) or (maxVel < minVel):
363 if (maxVel > velrange[-1]) or (maxVel < minVel):
364 print('maxVel: %.2f is out of the velocity range' % (maxVel))
364 print('maxVel: %.2f is out of the velocity range' % (maxVel))
365 print('maxVel is setting to %.2f' % (velrange[-1]))
365 print('maxVel is setting to %.2f' % (velrange[-1]))
366 maxVel = velrange[-1]
366 maxVel = velrange[-1]
367
367
368 # seleccion de indices para rango
368 # seleccion de indices para rango
369 minIndex = 0
369 minIndex = 0
370 maxIndex = 0
370 maxIndex = 0
371 heights = self.dataOut.heightList
371 heights = self.dataOut.heightList
372
372
373 inda = numpy.where(heights >= minHei)
373 inda = numpy.where(heights >= minHei)
374 indb = numpy.where(heights <= maxHei)
374 indb = numpy.where(heights <= maxHei)
375
375
376 try:
376 try:
377 minIndex = inda[0][0]
377 minIndex = inda[0][0]
378 except:
378 except:
379 minIndex = 0
379 minIndex = 0
380
380
381 try:
381 try:
382 maxIndex = indb[0][-1]
382 maxIndex = indb[0][-1]
383 except:
383 except:
384 maxIndex = len(heights)
384 maxIndex = len(heights)
385
385
386 if (minIndex < 0) or (minIndex > maxIndex):
386 if (minIndex < 0) or (minIndex > maxIndex):
387 raise ValueError("some value in (%d,%d) is not valid" % (
387 raise ValueError("some value in (%d,%d) is not valid" % (
388 minIndex, maxIndex))
388 minIndex, maxIndex))
389
389
390 if (maxIndex >= self.dataOut.nHeights):
390 if (maxIndex >= self.dataOut.nHeights):
391 maxIndex = self.dataOut.nHeights - 1
391 maxIndex = self.dataOut.nHeights - 1
392
392
393 # seleccion de indices para velocidades
393 # seleccion de indices para velocidades
394 indminvel = numpy.where(velrange >= minVel)
394 indminvel = numpy.where(velrange >= minVel)
395 indmaxvel = numpy.where(velrange <= maxVel)
395 indmaxvel = numpy.where(velrange <= maxVel)
396 try:
396 try:
397 minIndexVel = indminvel[0][0]
397 minIndexVel = indminvel[0][0]
398 except:
398 except:
399 minIndexVel = 0
399 minIndexVel = 0
400
400
401 try:
401 try:
402 maxIndexVel = indmaxvel[0][-1]
402 maxIndexVel = indmaxvel[0][-1]
403 except:
403 except:
404 maxIndexVel = len(velrange)
404 maxIndexVel = len(velrange)
405
405
406 # seleccion del espectro
406 # seleccion del espectro
407 data_spc = self.dataOut.data_spc[:,
407 data_spc = self.dataOut.data_spc[:,
408 minIndexVel:maxIndexVel + 1, minIndex:maxIndex + 1]
408 minIndexVel:maxIndexVel + 1, minIndex:maxIndex + 1]
409 # estimacion de ruido
409 # estimacion de ruido
410 noise = numpy.zeros(self.dataOut.nChannels)
410 noise = numpy.zeros(self.dataOut.nChannels)
411
411
412 for channel in range(self.dataOut.nChannels):
412 for channel in range(self.dataOut.nChannels):
413 daux = data_spc[channel, :, :]
413 daux = data_spc[channel, :, :]
414 sortdata = numpy.sort(daux, axis=None)
414 sortdata = numpy.sort(daux, axis=None)
415 noise[channel] = hildebrand_sekhon(sortdata, self.dataOut.nIncohInt)
415 noise[channel] = hildebrand_sekhon(sortdata, self.dataOut.nIncohInt)
416
416
417 self.dataOut.noise_estimation = noise.copy()
417 self.dataOut.noise_estimation = noise.copy()
418
418
419 return 1
419 return 1
420
420
421 class removeDC(Operation):
421 class removeDC(Operation):
422
422
423 def run(self, dataOut, mode=2):
423 def run(self, dataOut, mode=2):
424 self.dataOut = dataOut
424 self.dataOut = dataOut
425 jspectra = self.dataOut.data_spc
425 jspectra = self.dataOut.data_spc
426 jcspectra = self.dataOut.data_cspc
426 jcspectra = self.dataOut.data_cspc
427
427
428 num_chan = jspectra.shape[0]
428 num_chan = jspectra.shape[0]
429 num_hei = jspectra.shape[2]
429 num_hei = jspectra.shape[2]
430
430
431 if jcspectra is not None:
431 if jcspectra is not None:
432 jcspectraExist = True
432 jcspectraExist = True
433 num_pairs = jcspectra.shape[0]
433 num_pairs = jcspectra.shape[0]
434 else:
434 else:
435 jcspectraExist = False
435 jcspectraExist = False
436
436
437 freq_dc = int(jspectra.shape[1] / 2)
437 freq_dc = int(jspectra.shape[1] / 2)
438 ind_vel = numpy.array([-2, -1, 1, 2]) + freq_dc
438 ind_vel = numpy.array([-2, -1, 1, 2]) + freq_dc
439 ind_vel = ind_vel.astype(int)
439 ind_vel = ind_vel.astype(int)
440
440
441 if ind_vel[0] < 0:
441 if ind_vel[0] < 0:
442 ind_vel[list(range(0, 1))] = ind_vel[list(range(0, 1))] + self.num_prof
442 ind_vel[list(range(0, 1))] = ind_vel[list(range(0, 1))] + self.num_prof
443
443
444 if mode == 1:
444 if mode == 1:
445 jspectra[:, freq_dc, :] = (
445 jspectra[:, freq_dc, :] = (
446 jspectra[:, ind_vel[1], :] + jspectra[:, ind_vel[2], :]) / 2 # CORRECCION
446 jspectra[:, ind_vel[1], :] + jspectra[:, ind_vel[2], :]) / 2 # CORRECCION
447
447
448 if jcspectraExist:
448 if jcspectraExist:
449 jcspectra[:, freq_dc, :] = (
449 jcspectra[:, freq_dc, :] = (
450 jcspectra[:, ind_vel[1], :] + jcspectra[:, ind_vel[2], :]) / 2
450 jcspectra[:, ind_vel[1], :] + jcspectra[:, ind_vel[2], :]) / 2
451
451
452 if mode == 2:
452 if mode == 2:
453
453
454 vel = numpy.array([-2, -1, 1, 2])
454 vel = numpy.array([-2, -1, 1, 2])
455 xx = numpy.zeros([4, 4])
455 xx = numpy.zeros([4, 4])
456
456
457 for fil in range(4):
457 for fil in range(4):
458 xx[fil, :] = vel[fil]**numpy.asarray(list(range(4)))
458 xx[fil, :] = vel[fil]**numpy.asarray(list(range(4)))
459
459
460 xx_inv = numpy.linalg.inv(xx)
460 xx_inv = numpy.linalg.inv(xx)
461 xx_aux = xx_inv[0, :]
461 xx_aux = xx_inv[0, :]
462
462
463 for ich in range(num_chan):
463 for ich in range(num_chan):
464 yy = jspectra[ich, ind_vel, :]
464 yy = jspectra[ich, ind_vel, :]
465 jspectra[ich, freq_dc, :] = numpy.dot(xx_aux, yy)
465 jspectra[ich, freq_dc, :] = numpy.dot(xx_aux, yy)
466
466
467 junkid = jspectra[ich, freq_dc, :] <= 0
467 junkid = jspectra[ich, freq_dc, :] <= 0
468 cjunkid = sum(junkid)
468 cjunkid = sum(junkid)
469
469
470 if cjunkid.any():
470 if cjunkid.any():
471 jspectra[ich, freq_dc, junkid.nonzero()] = (
471 jspectra[ich, freq_dc, junkid.nonzero()] = (
472 jspectra[ich, ind_vel[1], junkid] + jspectra[ich, ind_vel[2], junkid]) / 2
472 jspectra[ich, ind_vel[1], junkid] + jspectra[ich, ind_vel[2], junkid]) / 2
473
473
474 if jcspectraExist:
474 if jcspectraExist:
475 for ip in range(num_pairs):
475 for ip in range(num_pairs):
476 yy = jcspectra[ip, ind_vel, :]
476 yy = jcspectra[ip, ind_vel, :]
477 jcspectra[ip, freq_dc, :] = numpy.dot(xx_aux, yy)
477 jcspectra[ip, freq_dc, :] = numpy.dot(xx_aux, yy)
478
478
479 self.dataOut.data_spc = jspectra
479 self.dataOut.data_spc = jspectra
480 self.dataOut.data_cspc = jcspectra
480 self.dataOut.data_cspc = jcspectra
481
481
482 return self.dataOut
482 return self.dataOut
483
483
484 # import matplotlib.pyplot as plt
484 # import matplotlib.pyplot as plt
485
485
486 def fit_func( x, a0, a1, a2): #, a3, a4, a5):
486 def fit_func( x, a0, a1, a2): #, a3, a4, a5):
487 z = (x - a1) / a2
487 z = (x - a1) / a2
488 y = a0 * numpy.exp(-z**2 / a2) #+ a3 + a4 * x + a5 * x**2
488 y = a0 * numpy.exp(-z**2 / a2) #+ a3 + a4 * x + a5 * x**2
489 return y
489 return y
490 class CleanRayleigh(Operation):
490 class CleanRayleigh(Operation):
491
491
492 def __init__(self):
492 def __init__(self):
493
493
494 Operation.__init__(self)
494 Operation.__init__(self)
495 self.i=0
495 self.i=0
496 self.isConfig = False
496 self.isConfig = False
497 self.__dataReady = False
497 self.__dataReady = False
498 self.__profIndex = 0
498 self.__profIndex = 0
499 self.byTime = False
499 self.byTime = False
500 self.byProfiles = False
500 self.byProfiles = False
501
501
502 self.bloques = None
502 self.bloques = None
503 self.bloque0 = None
503 self.bloque0 = None
504
504
505 self.index = 0
505 self.index = 0
506
506
507 self.buffer = 0
507 self.buffer = 0
508 self.buffer2 = 0
508 self.buffer2 = 0
509 self.buffer3 = 0
509 self.buffer3 = 0
510
510
511
511
512 def setup(self,dataOut,min_hei,max_hei,n, timeInterval,factor_stdv):
512 def setup(self,dataOut,min_hei,max_hei,n, timeInterval,factor_stdv):
513
513
514 self.nChannels = dataOut.nChannels
514 self.nChannels = dataOut.nChannels
515 self.nProf = dataOut.nProfiles
515 self.nProf = dataOut.nProfiles
516 self.nPairs = dataOut.data_cspc.shape[0]
516 self.nPairs = dataOut.data_cspc.shape[0]
517 self.pairsArray = numpy.array(dataOut.pairsList)
517 self.pairsArray = numpy.array(dataOut.pairsList)
518 self.spectra = dataOut.data_spc
518 self.spectra = dataOut.data_spc
519 self.cspectra = dataOut.data_cspc
519 self.cspectra = dataOut.data_cspc
520 self.heights = dataOut.heightList #alturas totales
520 self.heights = dataOut.heightList #alturas totales
521 self.nHeights = len(self.heights)
521 self.nHeights = len(self.heights)
522 self.min_hei = min_hei
522 self.min_hei = min_hei
523 self.max_hei = max_hei
523 self.max_hei = max_hei
524 if (self.min_hei == None):
524 if (self.min_hei == None):
525 self.min_hei = 0
525 self.min_hei = 0
526 if (self.max_hei == None):
526 if (self.max_hei == None):
527 self.max_hei = dataOut.heightList[-1]
527 self.max_hei = dataOut.heightList[-1]
528 self.hval = ((self.max_hei>=self.heights) & (self.heights >= self.min_hei)).nonzero()
528 self.hval = ((self.max_hei>=self.heights) & (self.heights >= self.min_hei)).nonzero()
529 self.heightsClean = self.heights[self.hval] #alturas filtradas
529 self.heightsClean = self.heights[self.hval] #alturas filtradas
530 self.hval = self.hval[0] # forma (N,), an solo N elementos -> Indices de alturas
530 self.hval = self.hval[0] # forma (N,), an solo N elementos -> Indices de alturas
531 self.nHeightsClean = len(self.heightsClean)
531 self.nHeightsClean = len(self.heightsClean)
532 self.channels = dataOut.channelList
532 self.channels = dataOut.channelList
533 self.nChan = len(self.channels)
533 self.nChan = len(self.channels)
534 self.nIncohInt = dataOut.nIncohInt
534 self.nIncohInt = dataOut.nIncohInt
535 self.__initime = dataOut.utctime
535 self.__initime = dataOut.utctime
536 self.maxAltInd = self.hval[-1]+1
536 self.maxAltInd = self.hval[-1]+1
537 self.minAltInd = self.hval[0]
537 self.minAltInd = self.hval[0]
538
538
539 self.crosspairs = dataOut.pairsList
539 self.crosspairs = dataOut.pairsList
540 self.nPairs = len(self.crosspairs)
540 self.nPairs = len(self.crosspairs)
541 self.normFactor = dataOut.normFactor
541 self.normFactor = dataOut.normFactor
542 self.nFFTPoints = dataOut.nFFTPoints
542 self.nFFTPoints = dataOut.nFFTPoints
543 self.ippSeconds = dataOut.ippSeconds
543 self.ippSeconds = dataOut.ippSeconds
544 self.currentTime = self.__initime
544 self.currentTime = self.__initime
545 self.pairsArray = numpy.array(dataOut.pairsList)
545 self.pairsArray = numpy.array(dataOut.pairsList)
546 self.factor_stdv = factor_stdv
546 self.factor_stdv = factor_stdv
547 print("CHANNELS: ",[x for x in self.channels])
547 #print("CHANNELS: ",[x for x in self.channels])
548
548
549 if n != None :
549 if n != None :
550 self.byProfiles = True
550 self.byProfiles = True
551 self.nIntProfiles = n
551 self.nIntProfiles = n
552 else:
552 else:
553 self.__integrationtime = timeInterval
553 self.__integrationtime = timeInterval
554
554
555 self.__dataReady = False
555 self.__dataReady = False
556 self.isConfig = True
556 self.isConfig = True
557
557
558
558
559
559
560 def run(self, dataOut,min_hei=None,max_hei=None, n=None, timeInterval=10,factor_stdv=2.5):
560 def run(self, dataOut,min_hei=None,max_hei=None, n=None, timeInterval=10,factor_stdv=2.5):
561 #print (dataOut.utctime)
561 #print (dataOut.utctime)
562 if not self.isConfig :
562 if not self.isConfig :
563 #print("Setting config")
563 #print("Setting config")
564 self.setup(dataOut, min_hei,max_hei,n,timeInterval,factor_stdv)
564 self.setup(dataOut, min_hei,max_hei,n,timeInterval,factor_stdv)
565 #print("Config Done")
565 #print("Config Done")
566 tini=dataOut.utctime
566 tini=dataOut.utctime
567
567
568 if self.byProfiles:
568 if self.byProfiles:
569 if self.__profIndex == self.nIntProfiles:
569 if self.__profIndex == self.nIntProfiles:
570 self.__dataReady = True
570 self.__dataReady = True
571 else:
571 else:
572 if (tini - self.__initime) >= self.__integrationtime:
572 if (tini - self.__initime) >= self.__integrationtime:
573 #print(tini - self.__initime,self.__profIndex)
573 #print(tini - self.__initime,self.__profIndex)
574 self.__dataReady = True
574 self.__dataReady = True
575 self.__initime = tini
575 self.__initime = tini
576
576
577 #if (tini.tm_min % 2) == 0 and (tini.tm_sec < 5 and self.fint==0):
577 #if (tini.tm_min % 2) == 0 and (tini.tm_sec < 5 and self.fint==0):
578
578
579 if self.__dataReady:
579 if self.__dataReady:
580 print("Data ready",self.__profIndex)
580 #print("Data ready",self.__profIndex)
581 self.__profIndex = 0
581 self.__profIndex = 0
582 jspc = self.buffer
582 jspc = self.buffer
583 jcspc = self.buffer2
583 jcspc = self.buffer2
584 #jnoise = self.buffer3
584 #jnoise = self.buffer3
585 self.buffer = dataOut.data_spc
585 self.buffer = dataOut.data_spc
586 self.buffer2 = dataOut.data_cspc
586 self.buffer2 = dataOut.data_cspc
587 #self.buffer3 = dataOut.noise
587 #self.buffer3 = dataOut.noise
588 self.currentTime = dataOut.utctime
588 self.currentTime = dataOut.utctime
589 if numpy.any(jspc) :
589 if numpy.any(jspc) :
590 #print( jspc.shape, jcspc.shape)
590 #print( jspc.shape, jcspc.shape)
591 jspc = numpy.reshape(jspc,(int(len(jspc)/self.nChannels),self.nChannels,self.nFFTPoints,self.nHeights))
591 jspc = numpy.reshape(jspc,(int(len(jspc)/self.nChannels),self.nChannels,self.nFFTPoints,self.nHeights))
592 jcspc= numpy.reshape(jcspc,(int(len(jcspc)/self.nPairs),self.nPairs,self.nFFTPoints,self.nHeights))
592 jcspc= numpy.reshape(jcspc,(int(len(jcspc)/self.nPairs),self.nPairs,self.nFFTPoints,self.nHeights))
593 self.__dataReady = False
593 self.__dataReady = False
594 #print( jspc.shape, jcspc.shape)
594 #print( jspc.shape, jcspc.shape)
595 dataOut.flagNoData = False
595 dataOut.flagNoData = False
596 else:
596 else:
597 dataOut.flagNoData = True
597 dataOut.flagNoData = True
598 self.__dataReady = False
598 self.__dataReady = False
599 return dataOut
599 return dataOut
600 else:
600 else:
601 #print( len(self.buffer))
601 #print( len(self.buffer))
602 if numpy.any(self.buffer):
602 if numpy.any(self.buffer):
603 self.buffer = numpy.concatenate((self.buffer,dataOut.data_spc), axis=0)
603 self.buffer = numpy.concatenate((self.buffer,dataOut.data_spc), axis=0)
604 self.buffer2 = numpy.concatenate((self.buffer2,dataOut.data_cspc), axis=0)
604 self.buffer2 = numpy.concatenate((self.buffer2,dataOut.data_cspc), axis=0)
605 self.buffer3 += dataOut.data_dc
605 self.buffer3 += dataOut.data_dc
606 else:
606 else:
607 self.buffer = dataOut.data_spc
607 self.buffer = dataOut.data_spc
608 self.buffer2 = dataOut.data_cspc
608 self.buffer2 = dataOut.data_cspc
609 self.buffer3 = dataOut.data_dc
609 self.buffer3 = dataOut.data_dc
610 #print self.index, self.fint
610 #print self.index, self.fint
611 #print self.buffer2.shape
611 #print self.buffer2.shape
612 dataOut.flagNoData = True ## NOTE: ?? revisar LUEGO
612 dataOut.flagNoData = True ## NOTE: ?? revisar LUEGO
613 self.__profIndex += 1
613 self.__profIndex += 1
614 return dataOut ## NOTE: REV
614 return dataOut ## NOTE: REV
615
615
616
616
617 #index = tini.tm_hour*12+tini.tm_min/5
617 #index = tini.tm_hour*12+tini.tm_min/5
618 '''REVISAR'''
618 '''REVISAR'''
619 # jspc = jspc/self.nFFTPoints/self.normFactor
619 # jspc = jspc/self.nFFTPoints/self.normFactor
620 # jcspc = jcspc/self.nFFTPoints/self.normFactor
620 # jcspc = jcspc/self.nFFTPoints/self.normFactor
621
621
622
622
623 #dataOut.data_spc,dataOut.data_cspc = self.CleanRayleigh(dataOut,jspc,jcspc,crosspairs,heights,channels,nProf,nHei,nChan,nPairs,nIncohInt,nBlocks=nBlocks)
624 #tmp_spectra,tmp_cspectra,sat_spectra,sat_cspectra = self.cleanRayleigh(dataOut,jspc,jcspc,self.min_hei,self.max_hei)
625 tmp_spectra,tmp_cspectra = self.cleanRayleigh(dataOut,jspc,jcspc,self.factor_stdv)
626 #jspectra = tmp_spectra*len(jspc[:,0,0,0])
627 #jcspectra = tmp_cspectra*len(jspc[:,0,0,0])
628
623
624 tmp_spectra,tmp_cspectra = self.cleanRayleigh(dataOut,jspc,jcspc,self.factor_stdv)
629 dataOut.data_spc = tmp_spectra
625 dataOut.data_spc = tmp_spectra
630 dataOut.data_cspc = tmp_cspectra
626 dataOut.data_cspc = tmp_cspectra
627
628 #dataOut.data_spc,dataOut.data_cspc = self.cleanRayleigh(dataOut,jspc,jcspc,self.factor_stdv)
629
631 dataOut.data_dc = self.buffer3
630 dataOut.data_dc = self.buffer3
632 dataOut.nIncohInt *= self.nIntProfiles
631 dataOut.nIncohInt *= self.nIntProfiles
633 dataOut.utctime = self.currentTime #tiempo promediado
632 dataOut.utctime = self.currentTime #tiempo promediado
634 #print("Time: ",time.localtime(dataOut.utctime))
633 #print("Time: ",time.localtime(dataOut.utctime))
635 # dataOut.data_spc = sat_spectra
634 # dataOut.data_spc = sat_spectra
636 # dataOut.data_cspc = sat_cspectra
635 # dataOut.data_cspc = sat_cspectra
637 self.buffer = 0
636 self.buffer = 0
638 self.buffer2 = 0
637 self.buffer2 = 0
639 self.buffer3 = 0
638 self.buffer3 = 0
640
639
641 return dataOut
640 return dataOut
642
641
643 def cleanRayleigh(self,dataOut,spectra,cspectra,factor_stdv):
642 def cleanRayleigh(self,dataOut,spectra,cspectra,factor_stdv):
644 print("OP cleanRayleigh")
643 #print("OP cleanRayleigh")
645 #import matplotlib.pyplot as plt
644 #import matplotlib.pyplot as plt
646 #for k in range(149):
645 #for k in range(149):
647
646
648 rfunc = cspectra.copy() #self.bloques
647 rfunc = cspectra.copy() #self.bloques
649 val_spc = spectra*0.0 #self.bloque0*0.0
648 #rfunc = cspectra
650 val_cspc = cspectra*0.0 #self.bloques*0.0
649 #val_spc = spectra*0.0 #self.bloque0*0.0
651 in_sat_spectra = spectra.copy() #self.bloque0
650 #val_cspc = cspectra*0.0 #self.bloques*0.0
652 in_sat_cspectra = cspectra.copy() #self.bloques
651 #in_sat_spectra = spectra.copy() #self.bloque0
652 #in_sat_cspectra = cspectra.copy() #self.bloques
653
653
654 raxs = math.ceil(math.sqrt(self.nPairs))
654 #raxs = math.ceil(math.sqrt(self.nPairs))
655 caxs = math.ceil(self.nPairs/raxs)
655 #caxs = math.ceil(self.nPairs/raxs)
656
656
657 #print(self.hval)
657 #print(self.hval)
658 #print numpy.absolute(rfunc[:,0,0,14])
658 #print numpy.absolute(rfunc[:,0,0,14])
659 gauss_fit, covariance = None, None
659 for ih in range(self.minAltInd,self.maxAltInd):
660 for ih in range(self.minAltInd,self.maxAltInd):
660 for ifreq in range(self.nFFTPoints):
661 for ifreq in range(self.nFFTPoints):
661 # fig, axs = plt.subplots(raxs, caxs)
662 # fig, axs = plt.subplots(raxs, caxs)
662 # fig2, axs2 = plt.subplots(raxs, caxs)
663 # fig2, axs2 = plt.subplots(raxs, caxs)
663 col_ax = 0
664 # col_ax = 0
664 row_ax = 0
665 # row_ax = 0
666 #print(len(self.nPairs))
665 for ii in range(self.nPairs): #PARES DE CANALES SELF y CROSS
667 for ii in range(self.nPairs): #PARES DE CANALES SELF y CROSS
666 #print("ii: ",ii)
668 #print("ii: ",ii)
667 if (col_ax%caxs==0 and col_ax!=0):
669 # if (col_ax%caxs==0 and col_ax!=0):
668 col_ax = 0
670 # col_ax = 0
669 row_ax += 1
671 # row_ax += 1
670 func2clean = 10*numpy.log10(numpy.absolute(rfunc[:,ii,ifreq,ih])) #Potencia?
672 func2clean = 10*numpy.log10(numpy.absolute(rfunc[:,ii,ifreq,ih])) #Potencia?
671 #print(func2clean.shape)
673 #print(func2clean.shape)
672 val = (numpy.isfinite(func2clean)==True).nonzero()
674 val = (numpy.isfinite(func2clean)==True).nonzero()
673
675
674 if len(val)>0: #limitador
676 if len(val)>0: #limitador
675 min_val = numpy.around(numpy.amin(func2clean)-2) #> (-40)
677 min_val = numpy.around(numpy.amin(func2clean)-2) #> (-40)
676 if min_val <= -40 :
678 if min_val <= -40 :
677 min_val = -40
679 min_val = -40
678 max_val = numpy.around(numpy.amax(func2clean)+2) #< 200
680 max_val = numpy.around(numpy.amax(func2clean)+2) #< 200
679 if max_val >= 200 :
681 if max_val >= 200 :
680 max_val = 200
682 max_val = 200
681 #print min_val, max_val
683 #print min_val, max_val
682 step = 1
684 step = 1
683 #print("Getting bins and the histogram")
685 #print("Getting bins and the histogram")
684 x_dist = min_val + numpy.arange(1 + ((max_val-(min_val))/step))*step
686 x_dist = min_val + numpy.arange(1 + ((max_val-(min_val))/step))*step
685 y_dist,binstep = numpy.histogram(func2clean,bins=range(int(min_val),int(max_val+2),step))
687 y_dist,binstep = numpy.histogram(func2clean,bins=range(int(min_val),int(max_val+2),step))
686 #print(len(y_dist),len(binstep[:-1]))
688 #print(len(y_dist),len(binstep[:-1]))
687 #print(row_ax,col_ax, " ..")
689 #print(row_ax,col_ax, " ..")
688 #print(self.pairsArray[ii][0],self.pairsArray[ii][1])
690 #print(self.pairsArray[ii][0],self.pairsArray[ii][1])
689 mean = numpy.sum(x_dist * y_dist) / numpy.sum(y_dist)
691 mean = numpy.sum(x_dist * y_dist) / numpy.sum(y_dist)
690 sigma = numpy.sqrt(numpy.sum(y_dist * (x_dist - mean)**2) / numpy.sum(y_dist))
692 sigma = numpy.sqrt(numpy.sum(y_dist * (x_dist - mean)**2) / numpy.sum(y_dist))
691 parg = [numpy.amax(y_dist),mean,sigma]
693 parg = [numpy.amax(y_dist),mean,sigma]
692 gauss_fit, covariance = None, None
694
693 newY = None
695 #newY = None
696
694 try :
697 try :
695 gauss_fit, covariance = curve_fit(fit_func, x_dist, y_dist,p0=parg)
698 gauss_fit, covariance = curve_fit(fit_func, x_dist, y_dist,p0=parg)
696 mode = gauss_fit[1]
699 mode = gauss_fit[1]
697 stdv = gauss_fit[2]
700 stdv = gauss_fit[2]
698 #print(" FIT OK",gauss_fit)
701 #print(" FIT OK",gauss_fit)
699 '''
702 '''
700 newY = fit_func(x_dist,gauss_fit[0],gauss_fit[1],gauss_fit[2])
703 newY = fit_func(x_dist,gauss_fit[0],gauss_fit[1],gauss_fit[2])
701 axs[row_ax,col_ax].plot(binstep[:-1],y_dist,color='green')
704 axs[row_ax,col_ax].plot(binstep[:-1],y_dist,color='green')
702 axs[row_ax,col_ax].plot(binstep[:-1],newY,color='red')
705 axs[row_ax,col_ax].plot(binstep[:-1],newY,color='red')
703 axs[row_ax,col_ax].set_title("Pair "+str(self.crosspairs[ii]))'''
706 axs[row_ax,col_ax].set_title("Pair "+str(self.crosspairs[ii]))'''
704 except:
707 except:
705 mode = mean
708 mode = mean
706 stdv = sigma
709 stdv = sigma
707 #print("FIT FAIL")
710 #print("FIT FAIL")
708
711
709
712
710 #print(mode,stdv)
713 #print(mode,stdv)
711 #Removing echoes greater than mode + 3*stdv
714 #Removing echoes greater than mode + std_factor*stdv
712 #factor_stdv = 2
713 noval = (abs(func2clean - mode)>=(factor_stdv*stdv)).nonzero()
715 noval = (abs(func2clean - mode)>=(factor_stdv*stdv)).nonzero()
714 #noval tiene los indices que se van a remover
716 #noval tiene los indices que se van a remover
715 #print("Pair ",ii," novals: ",len(noval[0]))
717 #print("Pair ",ii," novals: ",len(noval[0]))
716 if len(noval[0]) > 0: #forma de array (N,) es igual a longitud (N)
718 if len(noval[0]) > 0: #forma de array (N,) es igual a longitud (N)
717 novall = ((func2clean - mode) >= (factor_stdv*stdv)).nonzero()
719 novall = ((func2clean - mode) >= (factor_stdv*stdv)).nonzero()
718 #print(novall)
720 #print(novall)
719 #print(" ",self.pairsArray[ii])
721 #print(" ",self.pairsArray[ii])
720 cross_pairs = self.pairsArray[ii]
722 cross_pairs = self.pairsArray[ii]
721 #Getting coherent echoes which are removed.
723 #Getting coherent echoes which are removed.
722 # if len(novall[0]) > 0:
724 # if len(novall[0]) > 0:
723 #
725 #
724 # val_spc[novall[0],cross_pairs[0],ifreq,ih] = 1
726 # val_spc[novall[0],cross_pairs[0],ifreq,ih] = 1
725 # val_spc[novall[0],cross_pairs[1],ifreq,ih] = 1
727 # val_spc[novall[0],cross_pairs[1],ifreq,ih] = 1
726 # val_cspc[novall[0],ii,ifreq,ih] = 1
728 # val_cspc[novall[0],ii,ifreq,ih] = 1
727 #print("OUT NOVALL 1")
729 #print("OUT NOVALL 1")
728 #Removing coherent from ISR data
730 #Removing coherent from ISR data
729 chA = self.channels.index(cross_pairs[0])
731 chA = self.channels.index(cross_pairs[0])
730 chB = self.channels.index(cross_pairs[1])
732 chB = self.channels.index(cross_pairs[1])
731
733
732 new_a = numpy.delete(cspectra[:,ii,ifreq,ih], noval[0])
734 new_a = numpy.delete(cspectra[:,ii,ifreq,ih], noval[0])
733 mean_cspc = numpy.mean(new_a)
735 cspectra[noval,ii,ifreq,ih] = numpy.mean(new_a) #mean CrossSpectra
734 new_b = numpy.delete(spectra[:,chA,ifreq,ih], noval[0])
736 new_b = numpy.delete(spectra[:,chA,ifreq,ih], noval[0])
735 mean_spc0 = numpy.mean(new_b)
737 spectra[noval,chA,ifreq,ih] = numpy.mean(new_b) #mean Spectra Pair A
736 new_c = numpy.delete(spectra[:,chB,ifreq,ih], noval[0])
738 new_c = numpy.delete(spectra[:,chB,ifreq,ih], noval[0])
737 mean_spc1 = numpy.mean(new_c)
739 spectra[noval,chB,ifreq,ih] = numpy.mean(new_c) #mean Spectra Pair B
738 spectra[noval,chA,ifreq,ih] = mean_spc0
740
739 spectra[noval,chB,ifreq,ih] = mean_spc1
740 cspectra[noval,ii,ifreq,ih] = mean_cspc
741
741
742 '''
742 '''
743 func2clean = 10*numpy.log10(numpy.absolute(cspectra[:,ii,ifreq,ih]))
743 func2clean = 10*numpy.log10(numpy.absolute(cspectra[:,ii,ifreq,ih]))
744 y_dist,binstep = numpy.histogram(func2clean,bins=range(int(min_val),int(max_val+2),step))
744 y_dist,binstep = numpy.histogram(func2clean,bins=range(int(min_val),int(max_val+2),step))
745 axs2[row_ax,col_ax].plot(binstep[:-1],newY,color='red')
745 axs2[row_ax,col_ax].plot(binstep[:-1],newY,color='red')
746 axs2[row_ax,col_ax].plot(binstep[:-1],y_dist,color='green')
746 axs2[row_ax,col_ax].plot(binstep[:-1],y_dist,color='green')
747 axs2[row_ax,col_ax].set_title("Pair "+str(self.crosspairs[ii]))
747 axs2[row_ax,col_ax].set_title("Pair "+str(self.crosspairs[ii]))
748 '''
748 '''
749
749
750 col_ax += 1 #contador de ploteo columnas
750 #col_ax += 1 #contador de ploteo columnas
751 ##print(col_ax)
751 ##print(col_ax)
752 '''
752 '''
753 title = str(dataOut.datatime)+" nFFT: "+str(ifreq)+" Alt: "+str(self.heights[ih])+ " km"
753 title = str(dataOut.datatime)+" nFFT: "+str(ifreq)+" Alt: "+str(self.heights[ih])+ " km"
754 title2 = str(dataOut.datatime)+" nFFT: "+str(ifreq)+" Alt: "+str(self.heights[ih])+ " km CLEANED"
754 title2 = str(dataOut.datatime)+" nFFT: "+str(ifreq)+" Alt: "+str(self.heights[ih])+ " km CLEANED"
755 fig.suptitle(title)
755 fig.suptitle(title)
756 fig2.suptitle(title2)
756 fig2.suptitle(title2)
757 plt.show()'''
757 plt.show()'''
758
758
759 ''' channels = channels
759 ''' channels = channels
760 cross_pairs = cross_pairs
760 cross_pairs = cross_pairs
761 #print("OUT NOVALL 2")
761 #print("OUT NOVALL 2")
762
762
763 vcross0 = (cross_pairs[0] == channels[ii]).nonzero()
763 vcross0 = (cross_pairs[0] == channels[ii]).nonzero()
764 vcross1 = (cross_pairs[1] == channels[ii]).nonzero()
764 vcross1 = (cross_pairs[1] == channels[ii]).nonzero()
765 vcross = numpy.concatenate((vcross0,vcross1),axis=None)
765 vcross = numpy.concatenate((vcross0,vcross1),axis=None)
766 #print('vcros =', vcross)
766 #print('vcros =', vcross)
767
767
768 #Getting coherent echoes which are removed.
768 #Getting coherent echoes which are removed.
769 if len(novall) > 0:
769 if len(novall) > 0:
770 #val_spc[novall,ii,ifreq,ih] = 1
770 #val_spc[novall,ii,ifreq,ih] = 1
771 val_spc[ii,ifreq,ih,novall] = 1
771 val_spc[ii,ifreq,ih,novall] = 1
772 if len(vcross) > 0:
772 if len(vcross) > 0:
773 val_cspc[vcross,ifreq,ih,novall] = 1
773 val_cspc[vcross,ifreq,ih,novall] = 1
774
774
775 #Removing coherent from ISR data.
775 #Removing coherent from ISR data.
776 self.bloque0[ii,ifreq,ih,noval] = numpy.nan
776 self.bloque0[ii,ifreq,ih,noval] = numpy.nan
777 if len(vcross) > 0:
777 if len(vcross) > 0:
778 self.bloques[vcross,ifreq,ih,noval] = numpy.nan
778 self.bloques[vcross,ifreq,ih,noval] = numpy.nan
779 '''
779 '''
780
780
781 print("Getting average of the spectra and cross-spectra from incoherent echoes.")
781 #print("Getting average of the spectra and cross-spectra from incoherent echoes.")
782 out_spectra = numpy.zeros([self.nChan,self.nFFTPoints,self.nHeights], dtype=float) #+numpy.nan
782 out_spectra = numpy.zeros([self.nChan,self.nFFTPoints,self.nHeights], dtype=float) #+numpy.nan
783 out_cspectra = numpy.zeros([self.nPairs,self.nFFTPoints,self.nHeights], dtype=complex) #+numpy.nan
783 out_cspectra = numpy.zeros([self.nPairs,self.nFFTPoints,self.nHeights], dtype=complex) #+numpy.nan
784 for ih in range(self.nHeights):
784 for ih in range(self.nHeights):
785 for ifreq in range(self.nFFTPoints):
785 for ifreq in range(self.nFFTPoints):
786 for ich in range(self.nChan):
786 for ich in range(self.nChan):
787 tmp = spectra[:,ich,ifreq,ih]
787 tmp = spectra[:,ich,ifreq,ih]
788 valid = (numpy.isfinite(tmp[:])==True).nonzero()
788 valid = (numpy.isfinite(tmp[:])==True).nonzero()
789 # if ich == 0 and ifreq == 0 and ih == 17 :
789 # if ich == 0 and ifreq == 0 and ih == 17 :
790 # print tmp
790 # print tmp
791 # print valid
791 # print valid
792 # print len(valid[0])
792 # print len(valid[0])
793 #print('TMP',tmp)
793 #print('TMP',tmp)
794 if len(valid[0]) >0 :
794 if len(valid[0]) >0 :
795 out_spectra[ich,ifreq,ih] = numpy.nansum(tmp)#/len(valid[0])
795 out_spectra[ich,ifreq,ih] = numpy.nansum(tmp)#/len(valid[0])
796 #for icr in range(nPairs):
796 #for icr in range(nPairs):
797 for icr in range(self.nPairs):
797 for icr in range(self.nPairs):
798 tmp = numpy.squeeze(cspectra[:,icr,ifreq,ih])
798 tmp = numpy.squeeze(cspectra[:,icr,ifreq,ih])
799 valid = (numpy.isfinite(tmp)==True).nonzero()
799 valid = (numpy.isfinite(tmp)==True).nonzero()
800 if len(valid[0]) > 0:
800 if len(valid[0]) > 0:
801 out_cspectra[icr,ifreq,ih] = numpy.nansum(tmp)#/len(valid[0])
801 out_cspectra[icr,ifreq,ih] = numpy.nansum(tmp)#/len(valid[0])
802 '''
802 '''
803 # print('##########################################################')
803 # print('##########################################################')
804 print("Removing fake coherent echoes (at least 4 points around the point)")
804 print("Removing fake coherent echoes (at least 4 points around the point)")
805
805
806 val_spectra = numpy.sum(val_spc,0)
806 val_spectra = numpy.sum(val_spc,0)
807 val_cspectra = numpy.sum(val_cspc,0)
807 val_cspectra = numpy.sum(val_cspc,0)
808
808
809 val_spectra = self.REM_ISOLATED_POINTS(val_spectra,4)
809 val_spectra = self.REM_ISOLATED_POINTS(val_spectra,4)
810 val_cspectra = self.REM_ISOLATED_POINTS(val_cspectra,4)
810 val_cspectra = self.REM_ISOLATED_POINTS(val_cspectra,4)
811
811
812 for i in range(nChan):
812 for i in range(nChan):
813 for j in range(nProf):
813 for j in range(nProf):
814 for k in range(nHeights):
814 for k in range(nHeights):
815 if numpy.isfinite(val_spectra[i,j,k]) and val_spectra[i,j,k] < 1 :
815 if numpy.isfinite(val_spectra[i,j,k]) and val_spectra[i,j,k] < 1 :
816 val_spc[:,i,j,k] = 0.0
816 val_spc[:,i,j,k] = 0.0
817 for i in range(nPairs):
817 for i in range(nPairs):
818 for j in range(nProf):
818 for j in range(nProf):
819 for k in range(nHeights):
819 for k in range(nHeights):
820 if numpy.isfinite(val_cspectra[i,j,k]) and val_cspectra[i,j,k] < 1 :
820 if numpy.isfinite(val_cspectra[i,j,k]) and val_cspectra[i,j,k] < 1 :
821 val_cspc[:,i,j,k] = 0.0
821 val_cspc[:,i,j,k] = 0.0
822
822
823 # val_spc = numpy.reshape(val_spc, (len(spectra[:,0,0,0]),nProf*nHeights*nChan))
823 # val_spc = numpy.reshape(val_spc, (len(spectra[:,0,0,0]),nProf*nHeights*nChan))
824 # if numpy.isfinite(val_spectra)==str(True):
824 # if numpy.isfinite(val_spectra)==str(True):
825 # noval = (val_spectra<1).nonzero()
825 # noval = (val_spectra<1).nonzero()
826 # if len(noval) > 0:
826 # if len(noval) > 0:
827 # val_spc[:,noval] = 0.0
827 # val_spc[:,noval] = 0.0
828 # val_spc = numpy.reshape(val_spc, (149,nChan,nProf,nHeights))
828 # val_spc = numpy.reshape(val_spc, (149,nChan,nProf,nHeights))
829
829
830 #val_cspc = numpy.reshape(val_spc, (149,nChan*nHeights*nProf))
830 #val_cspc = numpy.reshape(val_spc, (149,nChan*nHeights*nProf))
831 #if numpy.isfinite(val_cspectra)==str(True):
831 #if numpy.isfinite(val_cspectra)==str(True):
832 # noval = (val_cspectra<1).nonzero()
832 # noval = (val_cspectra<1).nonzero()
833 # if len(noval) > 0:
833 # if len(noval) > 0:
834 # val_cspc[:,noval] = 0.0
834 # val_cspc[:,noval] = 0.0
835 # val_cspc = numpy.reshape(val_cspc, (149,nChan,nProf,nHeights))
835 # val_cspc = numpy.reshape(val_cspc, (149,nChan,nProf,nHeights))
836 tmp_sat_spectra = spectra.copy()
836 tmp_sat_spectra = spectra.copy()
837 tmp_sat_spectra = tmp_sat_spectra*numpy.nan
837 tmp_sat_spectra = tmp_sat_spectra*numpy.nan
838 tmp_sat_cspectra = cspectra.copy()
838 tmp_sat_cspectra = cspectra.copy()
839 tmp_sat_cspectra = tmp_sat_cspectra*numpy.nan
839 tmp_sat_cspectra = tmp_sat_cspectra*numpy.nan
840 '''
840 '''
841 # fig = plt.figure(figsize=(6,5))
841 # fig = plt.figure(figsize=(6,5))
842 # left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
842 # left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
843 # ax = fig.add_axes([left, bottom, width, height])
843 # ax = fig.add_axes([left, bottom, width, height])
844 # cp = ax.contour(10*numpy.log10(numpy.absolute(spectra[0,0,:,:])))
844 # cp = ax.contour(10*numpy.log10(numpy.absolute(spectra[0,0,:,:])))
845 # ax.clabel(cp, inline=True,fontsize=10)
845 # ax.clabel(cp, inline=True,fontsize=10)
846 # plt.show()
846 # plt.show()
847 '''
847 '''
848 val = (val_spc > 0).nonzero()
848 val = (val_spc > 0).nonzero()
849 if len(val[0]) > 0:
849 if len(val[0]) > 0:
850 tmp_sat_spectra[val] = in_sat_spectra[val]
850 tmp_sat_spectra[val] = in_sat_spectra[val]
851 val = (val_cspc > 0).nonzero()
851 val = (val_cspc > 0).nonzero()
852 if len(val[0]) > 0:
852 if len(val[0]) > 0:
853 tmp_sat_cspectra[val] = in_sat_cspectra[val]
853 tmp_sat_cspectra[val] = in_sat_cspectra[val]
854
854
855 print("Getting average of the spectra and cross-spectra from incoherent echoes 2")
855 print("Getting average of the spectra and cross-spectra from incoherent echoes 2")
856 sat_spectra = numpy.zeros((nChan,nProf,nHeights), dtype=float)
856 sat_spectra = numpy.zeros((nChan,nProf,nHeights), dtype=float)
857 sat_cspectra = numpy.zeros((nPairs,nProf,nHeights), dtype=complex)
857 sat_cspectra = numpy.zeros((nPairs,nProf,nHeights), dtype=complex)
858 for ih in range(nHeights):
858 for ih in range(nHeights):
859 for ifreq in range(nProf):
859 for ifreq in range(nProf):
860 for ich in range(nChan):
860 for ich in range(nChan):
861 tmp = numpy.squeeze(tmp_sat_spectra[:,ich,ifreq,ih])
861 tmp = numpy.squeeze(tmp_sat_spectra[:,ich,ifreq,ih])
862 valid = (numpy.isfinite(tmp)).nonzero()
862 valid = (numpy.isfinite(tmp)).nonzero()
863 if len(valid[0]) > 0:
863 if len(valid[0]) > 0:
864 sat_spectra[ich,ifreq,ih] = numpy.nansum(tmp)/len(valid[0])
864 sat_spectra[ich,ifreq,ih] = numpy.nansum(tmp)/len(valid[0])
865
865
866 for icr in range(nPairs):
866 for icr in range(nPairs):
867 tmp = numpy.squeeze(tmp_sat_cspectra[:,icr,ifreq,ih])
867 tmp = numpy.squeeze(tmp_sat_cspectra[:,icr,ifreq,ih])
868 valid = (numpy.isfinite(tmp)).nonzero()
868 valid = (numpy.isfinite(tmp)).nonzero()
869 if len(valid[0]) > 0:
869 if len(valid[0]) > 0:
870 sat_cspectra[icr,ifreq,ih] = numpy.nansum(tmp)/len(valid[0])
870 sat_cspectra[icr,ifreq,ih] = numpy.nansum(tmp)/len(valid[0])
871 '''
871 '''
872 #self.__dataReady= True
872 #self.__dataReady= True
873 #sat_spectra, sat_cspectra= sat_spectra, sat_cspectra
873 #sat_spectra, sat_cspectra= sat_spectra, sat_cspectra
874 #if not self.__dataReady:
874 #if not self.__dataReady:
875 #return None, None
875 #return None, None
876 #return out_spectra, out_cspectra ,sat_spectra,sat_cspectra
876 #return out_spectra, out_cspectra ,sat_spectra,sat_cspectra
877 return out_spectra, out_cspectra
877 return out_spectra, out_cspectra
878
878
879 def REM_ISOLATED_POINTS(self,array,rth):
879 def REM_ISOLATED_POINTS(self,array,rth):
880 # import matplotlib.pyplot as plt
880 # import matplotlib.pyplot as plt
881 if rth == None :
881 if rth == None :
882 rth = 4
882 rth = 4
883 print("REM ISO")
883 print("REM ISO")
884 num_prof = len(array[0,:,0])
884 num_prof = len(array[0,:,0])
885 num_hei = len(array[0,0,:])
885 num_hei = len(array[0,0,:])
886 n2d = len(array[:,0,0])
886 n2d = len(array[:,0,0])
887
887
888 for ii in range(n2d) :
888 for ii in range(n2d) :
889 #print ii,n2d
889 #print ii,n2d
890 tmp = array[ii,:,:]
890 tmp = array[ii,:,:]
891 #print tmp.shape, array[ii,101,:],array[ii,102,:]
891 #print tmp.shape, array[ii,101,:],array[ii,102,:]
892
892
893 # fig = plt.figure(figsize=(6,5))
893 # fig = plt.figure(figsize=(6,5))
894 # left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
894 # left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
895 # ax = fig.add_axes([left, bottom, width, height])
895 # ax = fig.add_axes([left, bottom, width, height])
896 # x = range(num_prof)
896 # x = range(num_prof)
897 # y = range(num_hei)
897 # y = range(num_hei)
898 # cp = ax.contour(y,x,tmp)
898 # cp = ax.contour(y,x,tmp)
899 # ax.clabel(cp, inline=True,fontsize=10)
899 # ax.clabel(cp, inline=True,fontsize=10)
900 # plt.show()
900 # plt.show()
901
901
902 #indxs = WHERE(FINITE(tmp) AND tmp GT 0,cindxs)
902 #indxs = WHERE(FINITE(tmp) AND tmp GT 0,cindxs)
903 tmp = numpy.reshape(tmp,num_prof*num_hei)
903 tmp = numpy.reshape(tmp,num_prof*num_hei)
904 indxs1 = (numpy.isfinite(tmp)==True).nonzero()
904 indxs1 = (numpy.isfinite(tmp)==True).nonzero()
905 indxs2 = (tmp > 0).nonzero()
905 indxs2 = (tmp > 0).nonzero()
906
906
907 indxs1 = (indxs1[0])
907 indxs1 = (indxs1[0])
908 indxs2 = indxs2[0]
908 indxs2 = indxs2[0]
909 #indxs1 = numpy.array(indxs1[0])
909 #indxs1 = numpy.array(indxs1[0])
910 #indxs2 = numpy.array(indxs2[0])
910 #indxs2 = numpy.array(indxs2[0])
911 indxs = None
911 indxs = None
912 #print indxs1 , indxs2
912 #print indxs1 , indxs2
913 for iv in range(len(indxs2)):
913 for iv in range(len(indxs2)):
914 indv = numpy.array((indxs1 == indxs2[iv]).nonzero())
914 indv = numpy.array((indxs1 == indxs2[iv]).nonzero())
915 #print len(indxs2), indv
915 #print len(indxs2), indv
916 if len(indv[0]) > 0 :
916 if len(indv[0]) > 0 :
917 indxs = numpy.concatenate((indxs,indxs2[iv]), axis=None)
917 indxs = numpy.concatenate((indxs,indxs2[iv]), axis=None)
918 # print indxs
918 # print indxs
919 indxs = indxs[1:]
919 indxs = indxs[1:]
920 #print(indxs, len(indxs))
920 #print(indxs, len(indxs))
921 if len(indxs) < 4 :
921 if len(indxs) < 4 :
922 array[ii,:,:] = 0.
922 array[ii,:,:] = 0.
923 return
923 return
924
924
925 xpos = numpy.mod(indxs ,num_hei)
925 xpos = numpy.mod(indxs ,num_hei)
926 ypos = (indxs / num_hei)
926 ypos = (indxs / num_hei)
927 sx = numpy.argsort(xpos) # Ordering respect to "x" (time)
927 sx = numpy.argsort(xpos) # Ordering respect to "x" (time)
928 #print sx
928 #print sx
929 xpos = xpos[sx]
929 xpos = xpos[sx]
930 ypos = ypos[sx]
930 ypos = ypos[sx]
931
931
932 # *********************************** Cleaning isolated points **********************************
932 # *********************************** Cleaning isolated points **********************************
933 ic = 0
933 ic = 0
934 while True :
934 while True :
935 r = numpy.sqrt(list(numpy.power((xpos[ic]-xpos),2)+ numpy.power((ypos[ic]-ypos),2)))
935 r = numpy.sqrt(list(numpy.power((xpos[ic]-xpos),2)+ numpy.power((ypos[ic]-ypos),2)))
936 #no_coh = WHERE(FINITE(r) AND (r LE rth),cno_coh)
936 #no_coh = WHERE(FINITE(r) AND (r LE rth),cno_coh)
937 #plt.plot(r)
937 #plt.plot(r)
938 #plt.show()
938 #plt.show()
939 no_coh1 = (numpy.isfinite(r)==True).nonzero()
939 no_coh1 = (numpy.isfinite(r)==True).nonzero()
940 no_coh2 = (r <= rth).nonzero()
940 no_coh2 = (r <= rth).nonzero()
941 #print r, no_coh1, no_coh2
941 #print r, no_coh1, no_coh2
942 no_coh1 = numpy.array(no_coh1[0])
942 no_coh1 = numpy.array(no_coh1[0])
943 no_coh2 = numpy.array(no_coh2[0])
943 no_coh2 = numpy.array(no_coh2[0])
944 no_coh = None
944 no_coh = None
945 #print valid1 , valid2
945 #print valid1 , valid2
946 for iv in range(len(no_coh2)):
946 for iv in range(len(no_coh2)):
947 indv = numpy.array((no_coh1 == no_coh2[iv]).nonzero())
947 indv = numpy.array((no_coh1 == no_coh2[iv]).nonzero())
948 if len(indv[0]) > 0 :
948 if len(indv[0]) > 0 :
949 no_coh = numpy.concatenate((no_coh,no_coh2[iv]), axis=None)
949 no_coh = numpy.concatenate((no_coh,no_coh2[iv]), axis=None)
950 no_coh = no_coh[1:]
950 no_coh = no_coh[1:]
951 #print len(no_coh), no_coh
951 #print len(no_coh), no_coh
952 if len(no_coh) < 4 :
952 if len(no_coh) < 4 :
953 #print xpos[ic], ypos[ic], ic
953 #print xpos[ic], ypos[ic], ic
954 # plt.plot(r)
954 # plt.plot(r)
955 # plt.show()
955 # plt.show()
956 xpos[ic] = numpy.nan
956 xpos[ic] = numpy.nan
957 ypos[ic] = numpy.nan
957 ypos[ic] = numpy.nan
958
958
959 ic = ic + 1
959 ic = ic + 1
960 if (ic == len(indxs)) :
960 if (ic == len(indxs)) :
961 break
961 break
962 #print( xpos, ypos)
962 #print( xpos, ypos)
963
963
964 indxs = (numpy.isfinite(list(xpos))==True).nonzero()
964 indxs = (numpy.isfinite(list(xpos))==True).nonzero()
965 #print indxs[0]
965 #print indxs[0]
966 if len(indxs[0]) < 4 :
966 if len(indxs[0]) < 4 :
967 array[ii,:,:] = 0.
967 array[ii,:,:] = 0.
968 return
968 return
969
969
970 xpos = xpos[indxs[0]]
970 xpos = xpos[indxs[0]]
971 ypos = ypos[indxs[0]]
971 ypos = ypos[indxs[0]]
972 for i in range(0,len(ypos)):
972 for i in range(0,len(ypos)):
973 ypos[i]=int(ypos[i])
973 ypos[i]=int(ypos[i])
974 junk = tmp
974 junk = tmp
975 tmp = junk*0.0
975 tmp = junk*0.0
976
976
977 tmp[list(xpos + (ypos*num_hei))] = junk[list(xpos + (ypos*num_hei))]
977 tmp[list(xpos + (ypos*num_hei))] = junk[list(xpos + (ypos*num_hei))]
978 array[ii,:,:] = numpy.reshape(tmp,(num_prof,num_hei))
978 array[ii,:,:] = numpy.reshape(tmp,(num_prof,num_hei))
979
979
980 #print array.shape
980 #print array.shape
981 #tmp = numpy.reshape(tmp,(num_prof,num_hei))
981 #tmp = numpy.reshape(tmp,(num_prof,num_hei))
982 #print tmp.shape
982 #print tmp.shape
983
983
984 # fig = plt.figure(figsize=(6,5))
984 # fig = plt.figure(figsize=(6,5))
985 # left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
985 # left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
986 # ax = fig.add_axes([left, bottom, width, height])
986 # ax = fig.add_axes([left, bottom, width, height])
987 # x = range(num_prof)
987 # x = range(num_prof)
988 # y = range(num_hei)
988 # y = range(num_hei)
989 # cp = ax.contour(y,x,array[ii,:,:])
989 # cp = ax.contour(y,x,array[ii,:,:])
990 # ax.clabel(cp, inline=True,fontsize=10)
990 # ax.clabel(cp, inline=True,fontsize=10)
991 # plt.show()
991 # plt.show()
992 return array
992 return array
993
993
994 class removeInterference(Operation):
994 class removeInterference(Operation):
995
995
996 def removeInterference2(self):
996 def removeInterference2(self):
997
997
998 cspc = self.dataOut.data_cspc
998 cspc = self.dataOut.data_cspc
999 spc = self.dataOut.data_spc
999 spc = self.dataOut.data_spc
1000 Heights = numpy.arange(cspc.shape[2])
1000 Heights = numpy.arange(cspc.shape[2])
1001 realCspc = numpy.abs(cspc)
1001 realCspc = numpy.abs(cspc)
1002
1002
1003 for i in range(cspc.shape[0]):
1003 for i in range(cspc.shape[0]):
1004 LinePower= numpy.sum(realCspc[i], axis=0)
1004 LinePower= numpy.sum(realCspc[i], axis=0)
1005 Threshold = numpy.amax(LinePower)-numpy.sort(LinePower)[len(Heights)-int(len(Heights)*0.1)]
1005 Threshold = numpy.amax(LinePower)-numpy.sort(LinePower)[len(Heights)-int(len(Heights)*0.1)]
1006 SelectedHeights = Heights[ numpy.where( LinePower < Threshold ) ]
1006 SelectedHeights = Heights[ numpy.where( LinePower < Threshold ) ]
1007 InterferenceSum = numpy.sum( realCspc[i,:,SelectedHeights], axis=0 )
1007 InterferenceSum = numpy.sum( realCspc[i,:,SelectedHeights], axis=0 )
1008 InterferenceThresholdMin = numpy.sort(InterferenceSum)[int(len(InterferenceSum)*0.98)]
1008 InterferenceThresholdMin = numpy.sort(InterferenceSum)[int(len(InterferenceSum)*0.98)]
1009 InterferenceThresholdMax = numpy.sort(InterferenceSum)[int(len(InterferenceSum)*0.99)]
1009 InterferenceThresholdMax = numpy.sort(InterferenceSum)[int(len(InterferenceSum)*0.99)]
1010
1010
1011
1011
1012 InterferenceRange = numpy.where( ([InterferenceSum > InterferenceThresholdMin]))# , InterferenceSum < InterferenceThresholdMax]) )
1012 InterferenceRange = numpy.where( ([InterferenceSum > InterferenceThresholdMin]))# , InterferenceSum < InterferenceThresholdMax]) )
1013 #InterferenceRange = numpy.where( ([InterferenceRange < InterferenceThresholdMax]))
1013 #InterferenceRange = numpy.where( ([InterferenceRange < InterferenceThresholdMax]))
1014 if len(InterferenceRange)<int(cspc.shape[1]*0.3):
1014 if len(InterferenceRange)<int(cspc.shape[1]*0.3):
1015 cspc[i,InterferenceRange,:] = numpy.NaN
1015 cspc[i,InterferenceRange,:] = numpy.NaN
1016
1016
1017 self.dataOut.data_cspc = cspc
1017 self.dataOut.data_cspc = cspc
1018
1018
1019 def removeInterference(self, interf = 2, hei_interf = None, nhei_interf = None, offhei_interf = None):
1019 def removeInterference(self, interf = 2, hei_interf = None, nhei_interf = None, offhei_interf = None):
1020
1020
1021 jspectra = self.dataOut.data_spc
1021 jspectra = self.dataOut.data_spc
1022 jcspectra = self.dataOut.data_cspc
1022 jcspectra = self.dataOut.data_cspc
1023 jnoise = self.dataOut.getNoise()
1023 jnoise = self.dataOut.getNoise()
1024 num_incoh = self.dataOut.nIncohInt
1024 num_incoh = self.dataOut.nIncohInt
1025
1025
1026 num_channel = jspectra.shape[0]
1026 num_channel = jspectra.shape[0]
1027 num_prof = jspectra.shape[1]
1027 num_prof = jspectra.shape[1]
1028 num_hei = jspectra.shape[2]
1028 num_hei = jspectra.shape[2]
1029
1029
1030 # hei_interf
1030 # hei_interf
1031 if hei_interf is None:
1031 if hei_interf is None:
1032 count_hei = int(num_hei / 2)
1032 count_hei = int(num_hei / 2)
1033 hei_interf = numpy.asmatrix(list(range(count_hei))) + num_hei - count_hei
1033 hei_interf = numpy.asmatrix(list(range(count_hei))) + num_hei - count_hei
1034 hei_interf = numpy.asarray(hei_interf)[0]
1034 hei_interf = numpy.asarray(hei_interf)[0]
1035 # nhei_interf
1035 # nhei_interf
1036 if (nhei_interf == None):
1036 if (nhei_interf == None):
1037 nhei_interf = 5
1037 nhei_interf = 5
1038 if (nhei_interf < 1):
1038 if (nhei_interf < 1):
1039 nhei_interf = 1
1039 nhei_interf = 1
1040 if (nhei_interf > count_hei):
1040 if (nhei_interf > count_hei):
1041 nhei_interf = count_hei
1041 nhei_interf = count_hei
1042 if (offhei_interf == None):
1042 if (offhei_interf == None):
1043 offhei_interf = 0
1043 offhei_interf = 0
1044
1044
1045 ind_hei = list(range(num_hei))
1045 ind_hei = list(range(num_hei))
1046 # mask_prof = numpy.asarray(range(num_prof - 2)) + 1
1046 # mask_prof = numpy.asarray(range(num_prof - 2)) + 1
1047 # mask_prof[range(num_prof/2 - 1,len(mask_prof))] += 1
1047 # mask_prof[range(num_prof/2 - 1,len(mask_prof))] += 1
1048 mask_prof = numpy.asarray(list(range(num_prof)))
1048 mask_prof = numpy.asarray(list(range(num_prof)))
1049 num_mask_prof = mask_prof.size
1049 num_mask_prof = mask_prof.size
1050 comp_mask_prof = [0, num_prof / 2]
1050 comp_mask_prof = [0, num_prof / 2]
1051
1051
1052 # noise_exist: Determina si la variable jnoise ha sido definida y contiene la informacion del ruido de cada canal
1052 # noise_exist: Determina si la variable jnoise ha sido definida y contiene la informacion del ruido de cada canal
1053 if (jnoise.size < num_channel or numpy.isnan(jnoise).any()):
1053 if (jnoise.size < num_channel or numpy.isnan(jnoise).any()):
1054 jnoise = numpy.nan
1054 jnoise = numpy.nan
1055 noise_exist = jnoise[0] < numpy.Inf
1055 noise_exist = jnoise[0] < numpy.Inf
1056
1056
1057 # Subrutina de Remocion de la Interferencia
1057 # Subrutina de Remocion de la Interferencia
1058 for ich in range(num_channel):
1058 for ich in range(num_channel):
1059 # Se ordena los espectros segun su potencia (menor a mayor)
1059 # Se ordena los espectros segun su potencia (menor a mayor)
1060 power = jspectra[ich, mask_prof, :]
1060 power = jspectra[ich, mask_prof, :]
1061 power = power[:, hei_interf]
1061 power = power[:, hei_interf]
1062 power = power.sum(axis=0)
1062 power = power.sum(axis=0)
1063 psort = power.ravel().argsort()
1063 psort = power.ravel().argsort()
1064
1064
1065 # Se estima la interferencia promedio en los Espectros de Potencia empleando
1065 # Se estima la interferencia promedio en los Espectros de Potencia empleando
1066 junkspc_interf = jspectra[ich, :, hei_interf[psort[list(range(
1066 junkspc_interf = jspectra[ich, :, hei_interf[psort[list(range(
1067 offhei_interf, nhei_interf + offhei_interf))]]]
1067 offhei_interf, nhei_interf + offhei_interf))]]]
1068
1068
1069 if noise_exist:
1069 if noise_exist:
1070 # tmp_noise = jnoise[ich] / num_prof
1070 # tmp_noise = jnoise[ich] / num_prof
1071 tmp_noise = jnoise[ich]
1071 tmp_noise = jnoise[ich]
1072 junkspc_interf = junkspc_interf - tmp_noise
1072 junkspc_interf = junkspc_interf - tmp_noise
1073 #junkspc_interf[:,comp_mask_prof] = 0
1073 #junkspc_interf[:,comp_mask_prof] = 0
1074
1074
1075 jspc_interf = junkspc_interf.sum(axis=0) / nhei_interf
1075 jspc_interf = junkspc_interf.sum(axis=0) / nhei_interf
1076 jspc_interf = jspc_interf.transpose()
1076 jspc_interf = jspc_interf.transpose()
1077 # Calculando el espectro de interferencia promedio
1077 # Calculando el espectro de interferencia promedio
1078 noiseid = numpy.where(
1078 noiseid = numpy.where(
1079 jspc_interf <= tmp_noise / numpy.sqrt(num_incoh))
1079 jspc_interf <= tmp_noise / numpy.sqrt(num_incoh))
1080 noiseid = noiseid[0]
1080 noiseid = noiseid[0]
1081 cnoiseid = noiseid.size
1081 cnoiseid = noiseid.size
1082 interfid = numpy.where(
1082 interfid = numpy.where(
1083 jspc_interf > tmp_noise / numpy.sqrt(num_incoh))
1083 jspc_interf > tmp_noise / numpy.sqrt(num_incoh))
1084 interfid = interfid[0]
1084 interfid = interfid[0]
1085 cinterfid = interfid.size
1085 cinterfid = interfid.size
1086
1086
1087 if (cnoiseid > 0):
1087 if (cnoiseid > 0):
1088 jspc_interf[noiseid] = 0
1088 jspc_interf[noiseid] = 0
1089
1089
1090 # Expandiendo los perfiles a limpiar
1090 # Expandiendo los perfiles a limpiar
1091 if (cinterfid > 0):
1091 if (cinterfid > 0):
1092 new_interfid = (
1092 new_interfid = (
1093 numpy.r_[interfid - 1, interfid, interfid + 1] + num_prof) % num_prof
1093 numpy.r_[interfid - 1, interfid, interfid + 1] + num_prof) % num_prof
1094 new_interfid = numpy.asarray(new_interfid)
1094 new_interfid = numpy.asarray(new_interfid)
1095 new_interfid = {x for x in new_interfid}
1095 new_interfid = {x for x in new_interfid}
1096 new_interfid = numpy.array(list(new_interfid))
1096 new_interfid = numpy.array(list(new_interfid))
1097 new_cinterfid = new_interfid.size
1097 new_cinterfid = new_interfid.size
1098 else:
1098 else:
1099 new_cinterfid = 0
1099 new_cinterfid = 0
1100
1100
1101 for ip in range(new_cinterfid):
1101 for ip in range(new_cinterfid):
1102 ind = junkspc_interf[:, new_interfid[ip]].ravel().argsort()
1102 ind = junkspc_interf[:, new_interfid[ip]].ravel().argsort()
1103 jspc_interf[new_interfid[ip]
1103 jspc_interf[new_interfid[ip]
1104 ] = junkspc_interf[ind[nhei_interf // 2], new_interfid[ip]]
1104 ] = junkspc_interf[ind[nhei_interf // 2], new_interfid[ip]]
1105
1105
1106 jspectra[ich, :, ind_hei] = jspectra[ich, :,
1106 jspectra[ich, :, ind_hei] = jspectra[ich, :,
1107 ind_hei] - jspc_interf # Corregir indices
1107 ind_hei] - jspc_interf # Corregir indices
1108
1108
1109 # Removiendo la interferencia del punto de mayor interferencia
1109 # Removiendo la interferencia del punto de mayor interferencia
1110 ListAux = jspc_interf[mask_prof].tolist()
1110 ListAux = jspc_interf[mask_prof].tolist()
1111 maxid = ListAux.index(max(ListAux))
1111 maxid = ListAux.index(max(ListAux))
1112
1112
1113 if cinterfid > 0:
1113 if cinterfid > 0:
1114 for ip in range(cinterfid * (interf == 2) - 1):
1114 for ip in range(cinterfid * (interf == 2) - 1):
1115 ind = (jspectra[ich, interfid[ip], :] < tmp_noise *
1115 ind = (jspectra[ich, interfid[ip], :] < tmp_noise *
1116 (1 + 1 / numpy.sqrt(num_incoh))).nonzero()
1116 (1 + 1 / numpy.sqrt(num_incoh))).nonzero()
1117 cind = len(ind)
1117 cind = len(ind)
1118
1118
1119 if (cind > 0):
1119 if (cind > 0):
1120 jspectra[ich, interfid[ip], ind] = tmp_noise * \
1120 jspectra[ich, interfid[ip], ind] = tmp_noise * \
1121 (1 + (numpy.random.uniform(cind) - 0.5) /
1121 (1 + (numpy.random.uniform(cind) - 0.5) /
1122 numpy.sqrt(num_incoh))
1122 numpy.sqrt(num_incoh))
1123
1123
1124 ind = numpy.array([-2, -1, 1, 2])
1124 ind = numpy.array([-2, -1, 1, 2])
1125 xx = numpy.zeros([4, 4])
1125 xx = numpy.zeros([4, 4])
1126
1126
1127 for id1 in range(4):
1127 for id1 in range(4):
1128 xx[:, id1] = ind[id1]**numpy.asarray(list(range(4)))
1128 xx[:, id1] = ind[id1]**numpy.asarray(list(range(4)))
1129
1129
1130 xx_inv = numpy.linalg.inv(xx)
1130 xx_inv = numpy.linalg.inv(xx)
1131 xx = xx_inv[:, 0]
1131 xx = xx_inv[:, 0]
1132 ind = (ind + maxid + num_mask_prof) % num_mask_prof
1132 ind = (ind + maxid + num_mask_prof) % num_mask_prof
1133 yy = jspectra[ich, mask_prof[ind], :]
1133 yy = jspectra[ich, mask_prof[ind], :]
1134 jspectra[ich, mask_prof[maxid], :] = numpy.dot(
1134 jspectra[ich, mask_prof[maxid], :] = numpy.dot(
1135 yy.transpose(), xx)
1135 yy.transpose(), xx)
1136
1136
1137 indAux = (jspectra[ich, :, :] < tmp_noise *
1137 indAux = (jspectra[ich, :, :] < tmp_noise *
1138 (1 - 1 / numpy.sqrt(num_incoh))).nonzero()
1138 (1 - 1 / numpy.sqrt(num_incoh))).nonzero()
1139 jspectra[ich, indAux[0], indAux[1]] = tmp_noise * \
1139 jspectra[ich, indAux[0], indAux[1]] = tmp_noise * \
1140 (1 - 1 / numpy.sqrt(num_incoh))
1140 (1 - 1 / numpy.sqrt(num_incoh))
1141
1141
1142 # Remocion de Interferencia en el Cross Spectra
1142 # Remocion de Interferencia en el Cross Spectra
1143 if jcspectra is None:
1143 if jcspectra is None:
1144 return jspectra, jcspectra
1144 return jspectra, jcspectra
1145 num_pairs = int(jcspectra.size / (num_prof * num_hei))
1145 num_pairs = int(jcspectra.size / (num_prof * num_hei))
1146 jcspectra = jcspectra.reshape(num_pairs, num_prof, num_hei)
1146 jcspectra = jcspectra.reshape(num_pairs, num_prof, num_hei)
1147
1147
1148 for ip in range(num_pairs):
1148 for ip in range(num_pairs):
1149
1149
1150 #-------------------------------------------
1150 #-------------------------------------------
1151
1151
1152 cspower = numpy.abs(jcspectra[ip, mask_prof, :])
1152 cspower = numpy.abs(jcspectra[ip, mask_prof, :])
1153 cspower = cspower[:, hei_interf]
1153 cspower = cspower[:, hei_interf]
1154 cspower = cspower.sum(axis=0)
1154 cspower = cspower.sum(axis=0)
1155
1155
1156 cspsort = cspower.ravel().argsort()
1156 cspsort = cspower.ravel().argsort()
1157 junkcspc_interf = jcspectra[ip, :, hei_interf[cspsort[list(range(
1157 junkcspc_interf = jcspectra[ip, :, hei_interf[cspsort[list(range(
1158 offhei_interf, nhei_interf + offhei_interf))]]]
1158 offhei_interf, nhei_interf + offhei_interf))]]]
1159 junkcspc_interf = junkcspc_interf.transpose()
1159 junkcspc_interf = junkcspc_interf.transpose()
1160 jcspc_interf = junkcspc_interf.sum(axis=1) / nhei_interf
1160 jcspc_interf = junkcspc_interf.sum(axis=1) / nhei_interf
1161
1161
1162 ind = numpy.abs(jcspc_interf[mask_prof]).ravel().argsort()
1162 ind = numpy.abs(jcspc_interf[mask_prof]).ravel().argsort()
1163
1163
1164 median_real = int(numpy.median(numpy.real(
1164 median_real = int(numpy.median(numpy.real(
1165 junkcspc_interf[mask_prof[ind[list(range(3 * num_prof // 4))]], :])))
1165 junkcspc_interf[mask_prof[ind[list(range(3 * num_prof // 4))]], :])))
1166 median_imag = int(numpy.median(numpy.imag(
1166 median_imag = int(numpy.median(numpy.imag(
1167 junkcspc_interf[mask_prof[ind[list(range(3 * num_prof // 4))]], :])))
1167 junkcspc_interf[mask_prof[ind[list(range(3 * num_prof // 4))]], :])))
1168 comp_mask_prof = [int(e) for e in comp_mask_prof]
1168 comp_mask_prof = [int(e) for e in comp_mask_prof]
1169 junkcspc_interf[comp_mask_prof, :] = numpy.complex(
1169 junkcspc_interf[comp_mask_prof, :] = numpy.complex(
1170 median_real, median_imag)
1170 median_real, median_imag)
1171
1171
1172 for iprof in range(num_prof):
1172 for iprof in range(num_prof):
1173 ind = numpy.abs(junkcspc_interf[iprof, :]).ravel().argsort()
1173 ind = numpy.abs(junkcspc_interf[iprof, :]).ravel().argsort()
1174 jcspc_interf[iprof] = junkcspc_interf[iprof, ind[nhei_interf // 2]]
1174 jcspc_interf[iprof] = junkcspc_interf[iprof, ind[nhei_interf // 2]]
1175
1175
1176 # Removiendo la Interferencia
1176 # Removiendo la Interferencia
1177 jcspectra[ip, :, ind_hei] = jcspectra[ip,
1177 jcspectra[ip, :, ind_hei] = jcspectra[ip,
1178 :, ind_hei] - jcspc_interf
1178 :, ind_hei] - jcspc_interf
1179
1179
1180 ListAux = numpy.abs(jcspc_interf[mask_prof]).tolist()
1180 ListAux = numpy.abs(jcspc_interf[mask_prof]).tolist()
1181 maxid = ListAux.index(max(ListAux))
1181 maxid = ListAux.index(max(ListAux))
1182
1182
1183 ind = numpy.array([-2, -1, 1, 2])
1183 ind = numpy.array([-2, -1, 1, 2])
1184 xx = numpy.zeros([4, 4])
1184 xx = numpy.zeros([4, 4])
1185
1185
1186 for id1 in range(4):
1186 for id1 in range(4):
1187 xx[:, id1] = ind[id1]**numpy.asarray(list(range(4)))
1187 xx[:, id1] = ind[id1]**numpy.asarray(list(range(4)))
1188
1188
1189 xx_inv = numpy.linalg.inv(xx)
1189 xx_inv = numpy.linalg.inv(xx)
1190 xx = xx_inv[:, 0]
1190 xx = xx_inv[:, 0]
1191
1191
1192 ind = (ind + maxid + num_mask_prof) % num_mask_prof
1192 ind = (ind + maxid + num_mask_prof) % num_mask_prof
1193 yy = jcspectra[ip, mask_prof[ind], :]
1193 yy = jcspectra[ip, mask_prof[ind], :]
1194 jcspectra[ip, mask_prof[maxid], :] = numpy.dot(yy.transpose(), xx)
1194 jcspectra[ip, mask_prof[maxid], :] = numpy.dot(yy.transpose(), xx)
1195
1195
1196 # Guardar Resultados
1196 # Guardar Resultados
1197 self.dataOut.data_spc = jspectra
1197 self.dataOut.data_spc = jspectra
1198 self.dataOut.data_cspc = jcspectra
1198 self.dataOut.data_cspc = jcspectra
1199
1199
1200 return 1
1200 return 1
1201
1201
1202 def run(self, dataOut, interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None, mode=1):
1202 def run(self, dataOut, interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None, mode=1):
1203
1203
1204 self.dataOut = dataOut
1204 self.dataOut = dataOut
1205
1205
1206 if mode == 1:
1206 if mode == 1:
1207 self.removeInterference(interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None)
1207 self.removeInterference(interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None)
1208 elif mode == 2:
1208 elif mode == 2:
1209 self.removeInterference2()
1209 self.removeInterference2()
1210
1210
1211 return self.dataOut
1211 return self.dataOut
1212
1212
1213
1213
1214 class IncohInt(Operation):
1214 class IncohInt(Operation):
1215
1215
1216 __profIndex = 0
1216 __profIndex = 0
1217 __withOverapping = False
1217 __withOverapping = False
1218
1218
1219 __byTime = False
1219 __byTime = False
1220 __initime = None
1220 __initime = None
1221 __lastdatatime = None
1221 __lastdatatime = None
1222 __integrationtime = None
1222 __integrationtime = None
1223
1223
1224 __buffer_spc = None
1224 __buffer_spc = None
1225 __buffer_cspc = None
1225 __buffer_cspc = None
1226 __buffer_dc = None
1226 __buffer_dc = None
1227
1227
1228 __dataReady = False
1228 __dataReady = False
1229
1229
1230 __timeInterval = None
1230 __timeInterval = None
1231
1231
1232 n = None
1232 n = None
1233
1233
1234 def __init__(self):
1234 def __init__(self):
1235
1235
1236 Operation.__init__(self)
1236 Operation.__init__(self)
1237
1237
1238 def setup(self, n=None, timeInterval=None, overlapping=False):
1238 def setup(self, n=None, timeInterval=None, overlapping=False):
1239 """
1239 """
1240 Set the parameters of the integration class.
1240 Set the parameters of the integration class.
1241
1241
1242 Inputs:
1242 Inputs:
1243
1243
1244 n : Number of coherent integrations
1244 n : Number of coherent integrations
1245 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
1245 timeInterval : Time of integration. If the parameter "n" is selected this one does not work
1246 overlapping :
1246 overlapping :
1247
1247
1248 """
1248 """
1249
1249
1250 self.__initime = None
1250 self.__initime = None
1251 self.__lastdatatime = 0
1251 self.__lastdatatime = 0
1252
1252
1253 self.__buffer_spc = 0
1253 self.__buffer_spc = 0
1254 self.__buffer_cspc = 0
1254 self.__buffer_cspc = 0
1255 self.__buffer_dc = 0
1255 self.__buffer_dc = 0
1256
1256
1257 self.__profIndex = 0
1257 self.__profIndex = 0
1258 self.__dataReady = False
1258 self.__dataReady = False
1259 self.__byTime = False
1259 self.__byTime = False
1260
1260
1261 if n is None and timeInterval is None:
1261 if n is None and timeInterval is None:
1262 raise ValueError("n or timeInterval should be specified ...")
1262 raise ValueError("n or timeInterval should be specified ...")
1263
1263
1264 if n is not None:
1264 if n is not None:
1265 self.n = int(n)
1265 self.n = int(n)
1266 else:
1266 else:
1267
1267
1268 self.__integrationtime = int(timeInterval)
1268 self.__integrationtime = int(timeInterval)
1269 self.n = None
1269 self.n = None
1270 self.__byTime = True
1270 self.__byTime = True
1271
1271
1272 def putData(self, data_spc, data_cspc, data_dc):
1272 def putData(self, data_spc, data_cspc, data_dc):
1273 """
1273 """
1274 Add a profile to the __buffer_spc and increase in one the __profileIndex
1274 Add a profile to the __buffer_spc and increase in one the __profileIndex
1275
1275
1276 """
1276 """
1277
1277
1278 self.__buffer_spc += data_spc
1278 self.__buffer_spc += data_spc
1279
1279
1280 if data_cspc is None:
1280 if data_cspc is None:
1281 self.__buffer_cspc = None
1281 self.__buffer_cspc = None
1282 else:
1282 else:
1283 self.__buffer_cspc += data_cspc
1283 self.__buffer_cspc += data_cspc
1284
1284
1285 if data_dc is None:
1285 if data_dc is None:
1286 self.__buffer_dc = None
1286 self.__buffer_dc = None
1287 else:
1287 else:
1288 self.__buffer_dc += data_dc
1288 self.__buffer_dc += data_dc
1289
1289
1290 self.__profIndex += 1
1290 self.__profIndex += 1
1291
1291
1292 return
1292 return
1293
1293
1294 def pushData(self):
1294 def pushData(self):
1295 """
1295 """
1296 Return the sum of the last profiles and the profiles used in the sum.
1296 Return the sum of the last profiles and the profiles used in the sum.
1297
1297
1298 Affected:
1298 Affected:
1299
1299
1300 self.__profileIndex
1300 self.__profileIndex
1301
1301
1302 """
1302 """
1303
1303
1304 data_spc = self.__buffer_spc
1304 data_spc = self.__buffer_spc
1305 data_cspc = self.__buffer_cspc
1305 data_cspc = self.__buffer_cspc
1306 data_dc = self.__buffer_dc
1306 data_dc = self.__buffer_dc
1307 n = self.__profIndex
1307 n = self.__profIndex
1308
1308
1309 self.__buffer_spc = 0
1309 self.__buffer_spc = 0
1310 self.__buffer_cspc = 0
1310 self.__buffer_cspc = 0
1311 self.__buffer_dc = 0
1311 self.__buffer_dc = 0
1312 self.__profIndex = 0
1312 self.__profIndex = 0
1313
1313
1314 return data_spc, data_cspc, data_dc, n
1314 return data_spc, data_cspc, data_dc, n
1315
1315
1316 def byProfiles(self, *args):
1316 def byProfiles(self, *args):
1317
1317
1318 self.__dataReady = False
1318 self.__dataReady = False
1319 avgdata_spc = None
1319 avgdata_spc = None
1320 avgdata_cspc = None
1320 avgdata_cspc = None
1321 avgdata_dc = None
1321 avgdata_dc = None
1322
1322
1323 self.putData(*args)
1323 self.putData(*args)
1324
1324
1325 if self.__profIndex == self.n:
1325 if self.__profIndex == self.n:
1326
1326
1327 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
1327 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
1328 self.n = n
1328 self.n = n
1329 self.__dataReady = True
1329 self.__dataReady = True
1330
1330
1331 return avgdata_spc, avgdata_cspc, avgdata_dc
1331 return avgdata_spc, avgdata_cspc, avgdata_dc
1332
1332
1333 def byTime(self, datatime, *args):
1333 def byTime(self, datatime, *args):
1334
1334
1335 self.__dataReady = False
1335 self.__dataReady = False
1336 avgdata_spc = None
1336 avgdata_spc = None
1337 avgdata_cspc = None
1337 avgdata_cspc = None
1338 avgdata_dc = None
1338 avgdata_dc = None
1339
1339
1340 self.putData(*args)
1340 self.putData(*args)
1341
1341
1342 if (datatime - self.__initime) >= self.__integrationtime:
1342 if (datatime - self.__initime) >= self.__integrationtime:
1343 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
1343 avgdata_spc, avgdata_cspc, avgdata_dc, n = self.pushData()
1344 self.n = n
1344 self.n = n
1345 self.__dataReady = True
1345 self.__dataReady = True
1346
1346
1347 return avgdata_spc, avgdata_cspc, avgdata_dc
1347 return avgdata_spc, avgdata_cspc, avgdata_dc
1348
1348
1349 def integrate(self, datatime, *args):
1349 def integrate(self, datatime, *args):
1350
1350
1351 if self.__profIndex == 0:
1351 if self.__profIndex == 0:
1352 self.__initime = datatime
1352 self.__initime = datatime
1353
1353
1354 if self.__byTime:
1354 if self.__byTime:
1355 avgdata_spc, avgdata_cspc, avgdata_dc = self.byTime(
1355 avgdata_spc, avgdata_cspc, avgdata_dc = self.byTime(
1356 datatime, *args)
1356 datatime, *args)
1357 else:
1357 else:
1358 avgdata_spc, avgdata_cspc, avgdata_dc = self.byProfiles(*args)
1358 avgdata_spc, avgdata_cspc, avgdata_dc = self.byProfiles(*args)
1359
1359
1360 if not self.__dataReady:
1360 if not self.__dataReady:
1361 return None, None, None, None
1361 return None, None, None, None
1362
1362
1363 return self.__initime, avgdata_spc, avgdata_cspc, avgdata_dc
1363 return self.__initime, avgdata_spc, avgdata_cspc, avgdata_dc
1364
1364
1365 def run(self, dataOut, n=None, timeInterval=None, overlapping=False):
1365 def run(self, dataOut, n=None, timeInterval=None, overlapping=False):
1366 if n == 1:
1366 if n == 1:
1367 return dataOut
1367 return dataOut
1368
1368
1369 dataOut.flagNoData = True
1369 dataOut.flagNoData = True
1370
1370
1371 if not self.isConfig:
1371 if not self.isConfig:
1372 self.setup(n, timeInterval, overlapping)
1372 self.setup(n, timeInterval, overlapping)
1373 self.isConfig = True
1373 self.isConfig = True
1374
1374
1375 avgdatatime, avgdata_spc, avgdata_cspc, avgdata_dc = self.integrate(dataOut.utctime,
1375 avgdatatime, avgdata_spc, avgdata_cspc, avgdata_dc = self.integrate(dataOut.utctime,
1376 dataOut.data_spc,
1376 dataOut.data_spc,
1377 dataOut.data_cspc,
1377 dataOut.data_cspc,
1378 dataOut.data_dc)
1378 dataOut.data_dc)
1379
1379
1380 if self.__dataReady:
1380 if self.__dataReady:
1381
1381
1382 dataOut.data_spc = avgdata_spc
1382 dataOut.data_spc = avgdata_spc
1383 dataOut.data_cspc = avgdata_cspc
1383 dataOut.data_cspc = avgdata_cspc
1384 dataOut.data_dc = avgdata_dc
1384 dataOut.data_dc = avgdata_dc
1385 dataOut.nIncohInt *= self.n
1385 dataOut.nIncohInt *= self.n
1386 dataOut.utctime = avgdatatime
1386 dataOut.utctime = avgdatatime
1387 dataOut.flagNoData = False
1387 dataOut.flagNoData = False
1388
1388
1389 return dataOut
1389 return dataOut
1390
1390
1391 class dopplerFlip(Operation):
1391 class dopplerFlip(Operation):
1392
1392
1393 def run(self, dataOut):
1393 def run(self, dataOut):
1394 # arreglo 1: (num_chan, num_profiles, num_heights)
1394 # arreglo 1: (num_chan, num_profiles, num_heights)
1395 self.dataOut = dataOut
1395 self.dataOut = dataOut
1396 # JULIA-oblicua, indice 2
1396 # JULIA-oblicua, indice 2
1397 # arreglo 2: (num_profiles, num_heights)
1397 # arreglo 2: (num_profiles, num_heights)
1398 jspectra = self.dataOut.data_spc[2]
1398 jspectra = self.dataOut.data_spc[2]
1399 jspectra_tmp = numpy.zeros(jspectra.shape)
1399 jspectra_tmp = numpy.zeros(jspectra.shape)
1400 num_profiles = jspectra.shape[0]
1400 num_profiles = jspectra.shape[0]
1401 freq_dc = int(num_profiles / 2)
1401 freq_dc = int(num_profiles / 2)
1402 # Flip con for
1402 # Flip con for
1403 for j in range(num_profiles):
1403 for j in range(num_profiles):
1404 jspectra_tmp[num_profiles-j-1]= jspectra[j]
1404 jspectra_tmp[num_profiles-j-1]= jspectra[j]
1405 # Intercambio perfil de DC con perfil inmediato anterior
1405 # Intercambio perfil de DC con perfil inmediato anterior
1406 jspectra_tmp[freq_dc-1]= jspectra[freq_dc-1]
1406 jspectra_tmp[freq_dc-1]= jspectra[freq_dc-1]
1407 jspectra_tmp[freq_dc]= jspectra[freq_dc]
1407 jspectra_tmp[freq_dc]= jspectra[freq_dc]
1408 # canal modificado es re-escrito en el arreglo de canales
1408 # canal modificado es re-escrito en el arreglo de canales
1409 self.dataOut.data_spc[2] = jspectra_tmp
1409 self.dataOut.data_spc[2] = jspectra_tmp
1410
1410
1411 return self.dataOut
1411 return self.dataOut
General Comments 0
You need to be logged in to leave comments. Login now