##// END OF EJS Templates
Update PedestalInformation
jespinoza -
r1443:ad8b94343301
parent child
Show More

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

@@ -1,662 +1,662
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 """API to create signal chain projects
5 """API to create signal chain projects
6
6
7 The API is provide through class: Project
7 The API is provide through class: Project
8 """
8 """
9
9
10 import re
10 import re
11 import sys
11 import sys
12 import ast
12 import ast
13 import datetime
13 import datetime
14 import traceback
14 import traceback
15 import time
15 import time
16 import multiprocessing
16 import multiprocessing
17 from multiprocessing import Process, Queue
17 from multiprocessing import Process, Queue
18 from threading import Thread
18 from threading import Thread
19 from xml.etree.ElementTree import ElementTree, Element, SubElement
19 from xml.etree.ElementTree import ElementTree, Element, SubElement
20
20
21 from schainpy.admin import Alarm, SchainWarning
21 from schainpy.admin import Alarm, SchainWarning
22 from schainpy.model import *
22 from schainpy.model import *
23 from schainpy.utils import log
23 from schainpy.utils import log
24
24
25 if 'darwin' in sys.platform and sys.version_info[0] == 3 and sys.version_info[1] > 7:
25 if 'darwin' in sys.platform and sys.version_info[0] == 3 and sys.version_info[1] > 7:
26 multiprocessing.set_start_method('fork')
26 multiprocessing.set_start_method('fork')
27
27
28 class ConfBase():
28 class ConfBase():
29
29
30 def __init__(self):
30 def __init__(self):
31
31
32 self.id = '0'
32 self.id = '0'
33 self.name = None
33 self.name = None
34 self.priority = None
34 self.priority = None
35 self.parameters = {}
35 self.parameters = {}
36 self.object = None
36 self.object = None
37 self.operations = []
37 self.operations = []
38
38
39 def getId(self):
39 def getId(self):
40
40
41 return self.id
41 return self.id
42
42
43 def getNewId(self):
43 def getNewId(self):
44
44
45 return int(self.id) * 10 + len(self.operations) + 1
45 return int(self.id) * 10 + len(self.operations) + 1
46
46
47 def updateId(self, new_id):
47 def updateId(self, new_id):
48
48
49 self.id = str(new_id)
49 self.id = str(new_id)
50
50
51 n = 1
51 n = 1
52 for conf in self.operations:
52 for conf in self.operations:
53 conf_id = str(int(new_id) * 10 + n)
53 conf_id = str(int(new_id) * 10 + n)
54 conf.updateId(conf_id)
54 conf.updateId(conf_id)
55 n += 1
55 n += 1
56
56
57 def getKwargs(self):
57 def getKwargs(self):
58
58
59 params = {}
59 params = {}
60
60
61 for key, value in self.parameters.items():
61 for key, value in self.parameters.items():
62 if value not in (None, '', ' '):
62 if value not in (None, '', ' '):
63 params[key] = value
63 params[key] = value
64
64
65 return params
65 return params
66
66
67 def update(self, **kwargs):
67 def update(self, **kwargs):
68
68
69 if 'format' not in kwargs:
69 if 'format' not in kwargs:
70 kwargs['format'] = None
70 kwargs['format'] = None
71 for key, value, fmt in kwargs.items():
71 for key, value, fmt in kwargs.items():
72 self.addParameter(name=key, value=value, format=fmt)
72 self.addParameter(name=key, value=value, format=fmt)
73
73
74 def addParameter(self, name, value, format=None):
74 def addParameter(self, name, value, format=None):
75 '''
75 '''
76 '''
76 '''
77 if os.path.isdir(value):
77 if format is not None:
78 self.parameters[name] = value
78 self.parameters[name] = eval(format)(value)
79 elif isinstance(value, str) and re.search(r'(\d+/\d+/\d+)', value):
79 elif isinstance(value, str) and re.search(r'(\d+/\d+/\d+)', value):
80 self.parameters[name] = datetime.date(*[int(x) for x in value.split('/')])
80 self.parameters[name] = datetime.date(*[int(x) for x in value.split('/')])
81 elif isinstance(value, str) and re.search(r'(\d+:\d+:\d+)', value):
81 elif isinstance(value, str) and re.search(r'(\d+:\d+:\d+)', value):
82 self.parameters[name] = datetime.time(*[int(x) for x in value.split(':')])
82 self.parameters[name] = datetime.time(*[int(x) for x in value.split(':')])
83 else:
83 else:
84 try:
84 try:
85 self.parameters[name] = ast.literal_eval(value)
85 self.parameters[name] = ast.literal_eval(value)
86 except:
86 except:
87 if isinstance(value, str) and ',' in value:
87 if isinstance(value, str) and ',' in value:
88 self.parameters[name] = value.split(',')
88 self.parameters[name] = value.split(',')
89 else:
89 else:
90 self.parameters[name] = value
90 self.parameters[name] = value
91
91
92 def getParameters(self):
92 def getParameters(self):
93
93
94 params = {}
94 params = {}
95 for key, value in self.parameters.items():
95 for key, value in self.parameters.items():
96 s = type(value).__name__
96 s = type(value).__name__
97 if s == 'date':
97 if s == 'date':
98 params[key] = value.strftime('%Y/%m/%d')
98 params[key] = value.strftime('%Y/%m/%d')
99 elif s == 'time':
99 elif s == 'time':
100 params[key] = value.strftime('%H:%M:%S')
100 params[key] = value.strftime('%H:%M:%S')
101 else:
101 else:
102 params[key] = str(value)
102 params[key] = str(value)
103
103
104 return params
104 return params
105
105
106 def makeXml(self, element):
106 def makeXml(self, element):
107
107
108 xml = SubElement(element, self.ELEMENTNAME)
108 xml = SubElement(element, self.ELEMENTNAME)
109 for label in self.xml_labels:
109 for label in self.xml_labels:
110 xml.set(label, str(getattr(self, label)))
110 xml.set(label, str(getattr(self, label)))
111
111
112 for key, value in self.getParameters().items():
112 for key, value in self.getParameters().items():
113 xml_param = SubElement(xml, 'Parameter')
113 xml_param = SubElement(xml, 'Parameter')
114 xml_param.set('name', key)
114 xml_param.set('name', key)
115 xml_param.set('value', value)
115 xml_param.set('value', value)
116
116
117 for conf in self.operations:
117 for conf in self.operations:
118 conf.makeXml(xml)
118 conf.makeXml(xml)
119
119
120 def __str__(self):
120 def __str__(self):
121
121
122 if self.ELEMENTNAME == 'Operation':
122 if self.ELEMENTNAME == 'Operation':
123 s = ' {}[id={}]\n'.format(self.name, self.id)
123 s = ' {}[id={}]\n'.format(self.name, self.id)
124 else:
124 else:
125 s = '{}[id={}, inputId={}]\n'.format(self.name, self.id, self.inputId)
125 s = '{}[id={}, inputId={}]\n'.format(self.name, self.id, self.inputId)
126
126
127 for key, value in self.parameters.items():
127 for key, value in self.parameters.items():
128 if self.ELEMENTNAME == 'Operation':
128 if self.ELEMENTNAME == 'Operation':
129 s += ' {}: {}\n'.format(key, value)
129 s += ' {}: {}\n'.format(key, value)
130 else:
130 else:
131 s += ' {}: {}\n'.format(key, value)
131 s += ' {}: {}\n'.format(key, value)
132
132
133 for conf in self.operations:
133 for conf in self.operations:
134 s += str(conf)
134 s += str(conf)
135
135
136 return s
136 return s
137
137
138 class OperationConf(ConfBase):
138 class OperationConf(ConfBase):
139
139
140 ELEMENTNAME = 'Operation'
140 ELEMENTNAME = 'Operation'
141 xml_labels = ['id', 'name']
141 xml_labels = ['id', 'name']
142
142
143 def setup(self, id, name, priority, project_id, err_queue):
143 def setup(self, id, name, priority, project_id, err_queue):
144
144
145 self.id = str(id)
145 self.id = str(id)
146 self.project_id = project_id
146 self.project_id = project_id
147 self.name = name
147 self.name = name
148 self.type = 'other'
148 self.type = 'other'
149 self.err_queue = err_queue
149 self.err_queue = err_queue
150
150
151 def readXml(self, element, project_id, err_queue):
151 def readXml(self, element, project_id, err_queue):
152
152
153 self.id = element.get('id')
153 self.id = element.get('id')
154 self.name = element.get('name')
154 self.name = element.get('name')
155 self.type = 'other'
155 self.type = 'other'
156 self.project_id = str(project_id)
156 self.project_id = str(project_id)
157 self.err_queue = err_queue
157 self.err_queue = err_queue
158
158
159 for elm in element.iter('Parameter'):
159 for elm in element.iter('Parameter'):
160 self.addParameter(elm.get('name'), elm.get('value'))
160 self.addParameter(elm.get('name'), elm.get('value'))
161
161
162 def createObject(self):
162 def createObject(self):
163
163
164 className = eval(self.name)
164 className = eval(self.name)
165
165
166 if 'Plot' in self.name or 'Writer' in self.name or 'Send' in self.name or 'print' in self.name:
166 if 'Plot' in self.name or 'Writer' in self.name or 'Send' in self.name or 'print' in self.name:
167 kwargs = self.getKwargs()
167 kwargs = self.getKwargs()
168 opObj = className(self.id, self.id, self.project_id, self.err_queue, **kwargs)
168 opObj = className(self.id, self.id, self.project_id, self.err_queue, **kwargs)
169 opObj.start()
169 opObj.start()
170 self.type = 'external'
170 self.type = 'external'
171 else:
171 else:
172 opObj = className()
172 opObj = className()
173
173
174 self.object = opObj
174 self.object = opObj
175 return opObj
175 return opObj
176
176
177 class ProcUnitConf(ConfBase):
177 class ProcUnitConf(ConfBase):
178
178
179 ELEMENTNAME = 'ProcUnit'
179 ELEMENTNAME = 'ProcUnit'
180 xml_labels = ['id', 'inputId', 'name']
180 xml_labels = ['id', 'inputId', 'name']
181
181
182 def setup(self, project_id, id, name, datatype, inputId, err_queue):
182 def setup(self, project_id, id, name, datatype, inputId, err_queue):
183 '''
183 '''
184 '''
184 '''
185
185
186 if datatype == None and name == None:
186 if datatype == None and name == None:
187 raise ValueError('datatype or name should be defined')
187 raise ValueError('datatype or name should be defined')
188
188
189 if name == None:
189 if name == None:
190 if 'Proc' in datatype:
190 if 'Proc' in datatype:
191 name = datatype
191 name = datatype
192 else:
192 else:
193 name = '%sProc' % (datatype)
193 name = '%sProc' % (datatype)
194
194
195 if datatype == None:
195 if datatype == None:
196 datatype = name.replace('Proc', '')
196 datatype = name.replace('Proc', '')
197
197
198 self.id = str(id)
198 self.id = str(id)
199 self.project_id = project_id
199 self.project_id = project_id
200 self.name = name
200 self.name = name
201 self.datatype = datatype
201 self.datatype = datatype
202 self.inputId = inputId
202 self.inputId = inputId
203 self.err_queue = err_queue
203 self.err_queue = err_queue
204 self.operations = []
204 self.operations = []
205 self.parameters = {}
205 self.parameters = {}
206
206
207 def removeOperation(self, id):
207 def removeOperation(self, id):
208
208
209 i = [1 if x.id==id else 0 for x in self.operations]
209 i = [1 if x.id==id else 0 for x in self.operations]
210 self.operations.pop(i.index(1))
210 self.operations.pop(i.index(1))
211
211
212 def getOperation(self, id):
212 def getOperation(self, id):
213
213
214 for conf in self.operations:
214 for conf in self.operations:
215 if conf.id == id:
215 if conf.id == id:
216 return conf
216 return conf
217
217
218 def addOperation(self, name, optype='self'):
218 def addOperation(self, name, optype='self'):
219 '''
219 '''
220 '''
220 '''
221
221
222 id = self.getNewId()
222 id = self.getNewId()
223 conf = OperationConf()
223 conf = OperationConf()
224 conf.setup(id, name=name, priority='0', project_id=self.project_id, err_queue=self.err_queue)
224 conf.setup(id, name=name, priority='0', project_id=self.project_id, err_queue=self.err_queue)
225 self.operations.append(conf)
225 self.operations.append(conf)
226
226
227 return conf
227 return conf
228
228
229 def readXml(self, element, project_id, err_queue):
229 def readXml(self, element, project_id, err_queue):
230
230
231 self.id = element.get('id')
231 self.id = element.get('id')
232 self.name = element.get('name')
232 self.name = element.get('name')
233 self.inputId = None if element.get('inputId') == 'None' else element.get('inputId')
233 self.inputId = None if element.get('inputId') == 'None' else element.get('inputId')
234 self.datatype = element.get('datatype', self.name.replace(self.ELEMENTNAME.replace('Unit', ''), ''))
234 self.datatype = element.get('datatype', self.name.replace(self.ELEMENTNAME.replace('Unit', ''), ''))
235 self.project_id = str(project_id)
235 self.project_id = str(project_id)
236 self.err_queue = err_queue
236 self.err_queue = err_queue
237 self.operations = []
237 self.operations = []
238 self.parameters = {}
238 self.parameters = {}
239
239
240 for elm in element:
240 for elm in element:
241 if elm.tag == 'Parameter':
241 if elm.tag == 'Parameter':
242 self.addParameter(elm.get('name'), elm.get('value'))
242 self.addParameter(elm.get('name'), elm.get('value'))
243 elif elm.tag == 'Operation':
243 elif elm.tag == 'Operation':
244 conf = OperationConf()
244 conf = OperationConf()
245 conf.readXml(elm, project_id, err_queue)
245 conf.readXml(elm, project_id, err_queue)
246 self.operations.append(conf)
246 self.operations.append(conf)
247
247
248 def createObjects(self):
248 def createObjects(self):
249 '''
249 '''
250 Instancia de unidades de procesamiento.
250 Instancia de unidades de procesamiento.
251 '''
251 '''
252
252
253 className = eval(self.name)
253 className = eval(self.name)
254 kwargs = self.getKwargs()
254 kwargs = self.getKwargs()
255 procUnitObj = className()
255 procUnitObj = className()
256 procUnitObj.name = self.name
256 procUnitObj.name = self.name
257 log.success('creating process...', self.name)
257 log.success('creating process...', self.name)
258
258
259 for conf in self.operations:
259 for conf in self.operations:
260
260
261 opObj = conf.createObject()
261 opObj = conf.createObject()
262
262
263 log.success('adding operation: {}, type:{}'.format(
263 log.success('adding operation: {}, type:{}'.format(
264 conf.name,
264 conf.name,
265 conf.type), self.name)
265 conf.type), self.name)
266
266
267 procUnitObj.addOperation(conf, opObj)
267 procUnitObj.addOperation(conf, opObj)
268
268
269 self.object = procUnitObj
269 self.object = procUnitObj
270
270
271 def run(self):
271 def run(self):
272 '''
272 '''
273 '''
273 '''
274
274
275 return self.object.call(**self.getKwargs())
275 return self.object.call(**self.getKwargs())
276
276
277
277
278 class ReadUnitConf(ProcUnitConf):
278 class ReadUnitConf(ProcUnitConf):
279
279
280 ELEMENTNAME = 'ReadUnit'
280 ELEMENTNAME = 'ReadUnit'
281
281
282 def __init__(self):
282 def __init__(self):
283
283
284 self.id = None
284 self.id = None
285 self.datatype = None
285 self.datatype = None
286 self.name = None
286 self.name = None
287 self.inputId = None
287 self.inputId = None
288 self.operations = []
288 self.operations = []
289 self.parameters = {}
289 self.parameters = {}
290
290
291 def setup(self, project_id, id, name, datatype, err_queue, path='', startDate='', endDate='',
291 def setup(self, project_id, id, name, datatype, err_queue, path='', startDate='', endDate='',
292 startTime='', endTime='', server=None, **kwargs):
292 startTime='', endTime='', server=None, **kwargs):
293
293
294 if datatype == None and name == None:
294 if datatype == None and name == None:
295 raise ValueError('datatype or name should be defined')
295 raise ValueError('datatype or name should be defined')
296 if name == None:
296 if name == None:
297 if 'Reader' in datatype:
297 if 'Reader' in datatype:
298 name = datatype
298 name = datatype
299 datatype = name.replace('Reader','')
299 datatype = name.replace('Reader','')
300 else:
300 else:
301 name = '{}Reader'.format(datatype)
301 name = '{}Reader'.format(datatype)
302 if datatype == None:
302 if datatype == None:
303 if 'Reader' in name:
303 if 'Reader' in name:
304 datatype = name.replace('Reader','')
304 datatype = name.replace('Reader','')
305 else:
305 else:
306 datatype = name
306 datatype = name
307 name = '{}Reader'.format(name)
307 name = '{}Reader'.format(name)
308
308
309 self.id = id
309 self.id = id
310 self.project_id = project_id
310 self.project_id = project_id
311 self.name = name
311 self.name = name
312 self.datatype = datatype
312 self.datatype = datatype
313 self.err_queue = err_queue
313 self.err_queue = err_queue
314
314
315 self.addParameter(name='path', value=path)
315 self.addParameter(name='path', value=path, format='str')
316 self.addParameter(name='startDate', value=startDate)
316 self.addParameter(name='startDate', value=startDate)
317 self.addParameter(name='endDate', value=endDate)
317 self.addParameter(name='endDate', value=endDate)
318 self.addParameter(name='startTime', value=startTime)
318 self.addParameter(name='startTime', value=startTime)
319 self.addParameter(name='endTime', value=endTime)
319 self.addParameter(name='endTime', value=endTime)
320
320
321 for key, value in kwargs.items():
321 for key, value in kwargs.items():
322 self.addParameter(name=key, value=value)
322 self.addParameter(name=key, value=value)
323
323
324
324
325 class Project(Process):
325 class Project(Process):
326 """API to create signal chain projects"""
326 """API to create signal chain projects"""
327
327
328 ELEMENTNAME = 'Project'
328 ELEMENTNAME = 'Project'
329
329
330 def __init__(self, name=''):
330 def __init__(self, name=''):
331
331
332 Process.__init__(self)
332 Process.__init__(self)
333 self.id = '1'
333 self.id = '1'
334 if name:
334 if name:
335 self.name = '{} ({})'.format(Process.__name__, name)
335 self.name = '{} ({})'.format(Process.__name__, name)
336 self.filename = None
336 self.filename = None
337 self.description = None
337 self.description = None
338 self.email = None
338 self.email = None
339 self.alarm = []
339 self.alarm = []
340 self.configurations = {}
340 self.configurations = {}
341 # self.err_queue = Queue()
341 # self.err_queue = Queue()
342 self.err_queue = None
342 self.err_queue = None
343 self.started = False
343 self.started = False
344
344
345 def getNewId(self):
345 def getNewId(self):
346
346
347 idList = list(self.configurations.keys())
347 idList = list(self.configurations.keys())
348 id = int(self.id) * 10
348 id = int(self.id) * 10
349
349
350 while True:
350 while True:
351 id += 1
351 id += 1
352
352
353 if str(id) in idList:
353 if str(id) in idList:
354 continue
354 continue
355
355
356 break
356 break
357
357
358 return str(id)
358 return str(id)
359
359
360 def updateId(self, new_id):
360 def updateId(self, new_id):
361
361
362 self.id = str(new_id)
362 self.id = str(new_id)
363
363
364 keyList = list(self.configurations.keys())
364 keyList = list(self.configurations.keys())
365 keyList.sort()
365 keyList.sort()
366
366
367 n = 1
367 n = 1
368 new_confs = {}
368 new_confs = {}
369
369
370 for procKey in keyList:
370 for procKey in keyList:
371
371
372 conf = self.configurations[procKey]
372 conf = self.configurations[procKey]
373 idProcUnit = str(int(self.id) * 10 + n)
373 idProcUnit = str(int(self.id) * 10 + n)
374 conf.updateId(idProcUnit)
374 conf.updateId(idProcUnit)
375 new_confs[idProcUnit] = conf
375 new_confs[idProcUnit] = conf
376 n += 1
376 n += 1
377
377
378 self.configurations = new_confs
378 self.configurations = new_confs
379
379
380 def setup(self, id=1, name='', description='', email=None, alarm=[]):
380 def setup(self, id=1, name='', description='', email=None, alarm=[]):
381
381
382 self.id = str(id)
382 self.id = str(id)
383 self.description = description
383 self.description = description
384 self.email = email
384 self.email = email
385 self.alarm = alarm
385 self.alarm = alarm
386 if name:
386 if name:
387 self.name = '{} ({})'.format(Process.__name__, name)
387 self.name = '{} ({})'.format(Process.__name__, name)
388
388
389 def update(self, **kwargs):
389 def update(self, **kwargs):
390
390
391 for key, value in kwargs.items():
391 for key, value in kwargs.items():
392 setattr(self, key, value)
392 setattr(self, key, value)
393
393
394 def clone(self):
394 def clone(self):
395
395
396 p = Project()
396 p = Project()
397 p.id = self.id
397 p.id = self.id
398 p.name = self.name
398 p.name = self.name
399 p.description = self.description
399 p.description = self.description
400 p.configurations = self.configurations.copy()
400 p.configurations = self.configurations.copy()
401
401
402 return p
402 return p
403
403
404 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
404 def addReadUnit(self, id=None, datatype=None, name=None, **kwargs):
405
405
406 '''
406 '''
407 '''
407 '''
408
408
409 if id is None:
409 if id is None:
410 idReadUnit = self.getNewId()
410 idReadUnit = self.getNewId()
411 else:
411 else:
412 idReadUnit = str(id)
412 idReadUnit = str(id)
413
413
414 conf = ReadUnitConf()
414 conf = ReadUnitConf()
415 conf.setup(self.id, idReadUnit, name, datatype, self.err_queue, **kwargs)
415 conf.setup(self.id, idReadUnit, name, datatype, self.err_queue, **kwargs)
416 self.configurations[conf.id] = conf
416 self.configurations[conf.id] = conf
417
417
418 return conf
418 return conf
419
419
420 def addProcUnit(self, id=None, inputId='0', datatype=None, name=None):
420 def addProcUnit(self, id=None, inputId='0', datatype=None, name=None):
421
421
422 '''
422 '''
423 '''
423 '''
424
424
425 if id is None:
425 if id is None:
426 idProcUnit = self.getNewId()
426 idProcUnit = self.getNewId()
427 else:
427 else:
428 idProcUnit = id
428 idProcUnit = id
429
429
430 conf = ProcUnitConf()
430 conf = ProcUnitConf()
431 conf.setup(self.id, idProcUnit, name, datatype, inputId, self.err_queue)
431 conf.setup(self.id, idProcUnit, name, datatype, inputId, self.err_queue)
432 self.configurations[conf.id] = conf
432 self.configurations[conf.id] = conf
433
433
434 return conf
434 return conf
435
435
436 def removeProcUnit(self, id):
436 def removeProcUnit(self, id):
437
437
438 if id in self.configurations:
438 if id in self.configurations:
439 self.configurations.pop(id)
439 self.configurations.pop(id)
440
440
441 def getReadUnit(self):
441 def getReadUnit(self):
442
442
443 for obj in list(self.configurations.values()):
443 for obj in list(self.configurations.values()):
444 if obj.ELEMENTNAME == 'ReadUnit':
444 if obj.ELEMENTNAME == 'ReadUnit':
445 return obj
445 return obj
446
446
447 return None
447 return None
448
448
449 def getProcUnit(self, id):
449 def getProcUnit(self, id):
450
450
451 return self.configurations[id]
451 return self.configurations[id]
452
452
453 def getUnits(self):
453 def getUnits(self):
454
454
455 keys = list(self.configurations)
455 keys = list(self.configurations)
456 keys.sort()
456 keys.sort()
457
457
458 for key in keys:
458 for key in keys:
459 yield self.configurations[key]
459 yield self.configurations[key]
460
460
461 def updateUnit(self, id, **kwargs):
461 def updateUnit(self, id, **kwargs):
462
462
463 conf = self.configurations[id].update(**kwargs)
463 conf = self.configurations[id].update(**kwargs)
464
464
465 def makeXml(self):
465 def makeXml(self):
466
466
467 xml = Element('Project')
467 xml = Element('Project')
468 xml.set('id', str(self.id))
468 xml.set('id', str(self.id))
469 xml.set('name', self.name)
469 xml.set('name', self.name)
470 xml.set('description', self.description)
470 xml.set('description', self.description)
471
471
472 for conf in self.configurations.values():
472 for conf in self.configurations.values():
473 conf.makeXml(xml)
473 conf.makeXml(xml)
474
474
475 self.xml = xml
475 self.xml = xml
476
476
477 def writeXml(self, filename=None):
477 def writeXml(self, filename=None):
478
478
479 if filename == None:
479 if filename == None:
480 if self.filename:
480 if self.filename:
481 filename = self.filename
481 filename = self.filename
482 else:
482 else:
483 filename = 'schain.xml'
483 filename = 'schain.xml'
484
484
485 if not filename:
485 if not filename:
486 print('filename has not been defined. Use setFilename(filename) for do it.')
486 print('filename has not been defined. Use setFilename(filename) for do it.')
487 return 0
487 return 0
488
488
489 abs_file = os.path.abspath(filename)
489 abs_file = os.path.abspath(filename)
490
490
491 if not os.access(os.path.dirname(abs_file), os.W_OK):
491 if not os.access(os.path.dirname(abs_file), os.W_OK):
492 print('No write permission on %s' % os.path.dirname(abs_file))
492 print('No write permission on %s' % os.path.dirname(abs_file))
493 return 0
493 return 0
494
494
495 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
495 if os.path.isfile(abs_file) and not(os.access(abs_file, os.W_OK)):
496 print('File %s already exists and it could not be overwriten' % abs_file)
496 print('File %s already exists and it could not be overwriten' % abs_file)
497 return 0
497 return 0
498
498
499 self.makeXml()
499 self.makeXml()
500
500
501 ElementTree(self.xml).write(abs_file, method='xml')
501 ElementTree(self.xml).write(abs_file, method='xml')
502
502
503 self.filename = abs_file
503 self.filename = abs_file
504
504
505 return 1
505 return 1
506
506
507 def readXml(self, filename):
507 def readXml(self, filename):
508
508
509 abs_file = os.path.abspath(filename)
509 abs_file = os.path.abspath(filename)
510
510
511 self.configurations = {}
511 self.configurations = {}
512
512
513 try:
513 try:
514 self.xml = ElementTree().parse(abs_file)
514 self.xml = ElementTree().parse(abs_file)
515 except:
515 except:
516 log.error('Error reading %s, verify file format' % filename)
516 log.error('Error reading %s, verify file format' % filename)
517 return 0
517 return 0
518
518
519 self.id = self.xml.get('id')
519 self.id = self.xml.get('id')
520 self.name = self.xml.get('name')
520 self.name = self.xml.get('name')
521 self.description = self.xml.get('description')
521 self.description = self.xml.get('description')
522
522
523 for element in self.xml:
523 for element in self.xml:
524 if element.tag == 'ReadUnit':
524 if element.tag == 'ReadUnit':
525 conf = ReadUnitConf()
525 conf = ReadUnitConf()
526 conf.readXml(element, self.id, self.err_queue)
526 conf.readXml(element, self.id, self.err_queue)
527 self.configurations[conf.id] = conf
527 self.configurations[conf.id] = conf
528 elif element.tag == 'ProcUnit':
528 elif element.tag == 'ProcUnit':
529 conf = ProcUnitConf()
529 conf = ProcUnitConf()
530 input_proc = self.configurations[element.get('inputId')]
530 input_proc = self.configurations[element.get('inputId')]
531 conf.readXml(element, self.id, self.err_queue)
531 conf.readXml(element, self.id, self.err_queue)
532 self.configurations[conf.id] = conf
532 self.configurations[conf.id] = conf
533
533
534 self.filename = abs_file
534 self.filename = abs_file
535
535
536 return 1
536 return 1
537
537
538 def __str__(self):
538 def __str__(self):
539
539
540 text = '\nProject[id=%s, name=%s, description=%s]\n\n' % (
540 text = '\nProject[id=%s, name=%s, description=%s]\n\n' % (
541 self.id,
541 self.id,
542 self.name,
542 self.name,
543 self.description,
543 self.description,
544 )
544 )
545
545
546 for conf in self.configurations.values():
546 for conf in self.configurations.values():
547 text += '{}'.format(conf)
547 text += '{}'.format(conf)
548
548
549 return text
549 return text
550
550
551 def createObjects(self):
551 def createObjects(self):
552
552
553 keys = list(self.configurations.keys())
553 keys = list(self.configurations.keys())
554 keys.sort()
554 keys.sort()
555 for key in keys:
555 for key in keys:
556 conf = self.configurations[key]
556 conf = self.configurations[key]
557 conf.createObjects()
557 conf.createObjects()
558 if conf.inputId is not None:
558 if conf.inputId is not None:
559 conf.object.setInput(self.configurations[conf.inputId].object)
559 conf.object.setInput(self.configurations[conf.inputId].object)
560
560
561 def monitor(self):
561 def monitor(self):
562
562
563 t = Thread(target=self._monitor, args=(self.err_queue, self.ctx))
563 t = Thread(target=self._monitor, args=(self.err_queue, self.ctx))
564 t.start()
564 t.start()
565
565
566 def _monitor(self, queue, ctx):
566 def _monitor(self, queue, ctx):
567
567
568 import socket
568 import socket
569
569
570 procs = 0
570 procs = 0
571 err_msg = ''
571 err_msg = ''
572
572
573 while True:
573 while True:
574 msg = queue.get()
574 msg = queue.get()
575 if '#_start_#' in msg:
575 if '#_start_#' in msg:
576 procs += 1
576 procs += 1
577 elif '#_end_#' in msg:
577 elif '#_end_#' in msg:
578 procs -=1
578 procs -=1
579 else:
579 else:
580 err_msg = msg
580 err_msg = msg
581
581
582 if procs == 0 or 'Traceback' in err_msg:
582 if procs == 0 or 'Traceback' in err_msg:
583 break
583 break
584 time.sleep(0.1)
584 time.sleep(0.1)
585
585
586 if '|' in err_msg:
586 if '|' in err_msg:
587 name, err = err_msg.split('|')
587 name, err = err_msg.split('|')
588 if 'SchainWarning' in err:
588 if 'SchainWarning' in err:
589 log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), name)
589 log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), name)
590 elif 'SchainError' in err:
590 elif 'SchainError' in err:
591 log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), name)
591 log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), name)
592 else:
592 else:
593 log.error(err, name)
593 log.error(err, name)
594 else:
594 else:
595 name, err = self.name, err_msg
595 name, err = self.name, err_msg
596
596
597 time.sleep(1)
597 time.sleep(1)
598
598
599 ctx.term()
599 ctx.term()
600
600
601 message = ''.join(err)
601 message = ''.join(err)
602
602
603 if err_msg:
603 if err_msg:
604 subject = 'SChain v%s: Error running %s\n' % (
604 subject = 'SChain v%s: Error running %s\n' % (
605 schainpy.__version__, self.name)
605 schainpy.__version__, self.name)
606
606
607 subtitle = 'Hostname: %s\n' % socket.gethostbyname(
607 subtitle = 'Hostname: %s\n' % socket.gethostbyname(
608 socket.gethostname())
608 socket.gethostname())
609 subtitle += 'Working directory: %s\n' % os.path.abspath('./')
609 subtitle += 'Working directory: %s\n' % os.path.abspath('./')
610 subtitle += 'Configuration file: %s\n' % self.filename
610 subtitle += 'Configuration file: %s\n' % self.filename
611 subtitle += 'Time: %s\n' % str(datetime.datetime.now())
611 subtitle += 'Time: %s\n' % str(datetime.datetime.now())
612
612
613 readUnitConfObj = self.getReadUnit()
613 readUnitConfObj = self.getReadUnit()
614 if readUnitConfObj:
614 if readUnitConfObj:
615 subtitle += '\nInput parameters:\n'
615 subtitle += '\nInput parameters:\n'
616 subtitle += '[Data path = %s]\n' % readUnitConfObj.parameters['path']
616 subtitle += '[Data path = %s]\n' % readUnitConfObj.parameters['path']
617 subtitle += '[Start date = %s]\n' % readUnitConfObj.parameters['startDate']
617 subtitle += '[Start date = %s]\n' % readUnitConfObj.parameters['startDate']
618 subtitle += '[End date = %s]\n' % readUnitConfObj.parameters['endDate']
618 subtitle += '[End date = %s]\n' % readUnitConfObj.parameters['endDate']
619 subtitle += '[Start time = %s]\n' % readUnitConfObj.parameters['startTime']
619 subtitle += '[Start time = %s]\n' % readUnitConfObj.parameters['startTime']
620 subtitle += '[End time = %s]\n' % readUnitConfObj.parameters['endTime']
620 subtitle += '[End time = %s]\n' % readUnitConfObj.parameters['endTime']
621
621
622 a = Alarm(
622 a = Alarm(
623 modes=self.alarm,
623 modes=self.alarm,
624 email=self.email,
624 email=self.email,
625 message=message,
625 message=message,
626 subject=subject,
626 subject=subject,
627 subtitle=subtitle,
627 subtitle=subtitle,
628 filename=self.filename
628 filename=self.filename
629 )
629 )
630
630
631 a.start()
631 a.start()
632
632
633 def setFilename(self, filename):
633 def setFilename(self, filename):
634
634
635 self.filename = filename
635 self.filename = filename
636
636
637 def runProcs(self):
637 def runProcs(self):
638
638
639 err = False
639 err = False
640 n = len(self.configurations)
640 n = len(self.configurations)
641
641
642 while not err:
642 while not err:
643 for conf in self.getUnits():
643 for conf in self.getUnits():
644 ok = conf.run()
644 ok = conf.run()
645 if ok == 'Error':
645 if ok == 'Error':
646 n -= 1
646 n -= 1
647 continue
647 continue
648 elif not ok:
648 elif not ok:
649 break
649 break
650 if n == 0:
650 if n == 0:
651 err = True
651 err = True
652
652
653 def run(self):
653 def run(self):
654
654
655 log.success('\nStarting Project {} [id={}]'.format(self.name, self.id), tag='')
655 log.success('\nStarting Project {} [id={}]'.format(self.name, self.id), tag='')
656 self.started = True
656 self.started = True
657 self.start_time = time.time()
657 self.start_time = time.time()
658 self.createObjects()
658 self.createObjects()
659 self.runProcs()
659 self.runProcs()
660 log.success('{} Done (Time: {:4.2f}s)'.format(
660 log.success('{} Done (Time: {:4.2f}s)'.format(
661 self.name,
661 self.name,
662 time.time()-self.start_time), '')
662 time.time()-self.start_time), '')
@@ -1,2378 +1,2383
1 import os
1 import os
2 import datetime
2 import datetime
3 import numpy
3 import numpy
4 from mpl_toolkits.axisartist.grid_finder import FixedLocator, DictFormatter
4 from mpl_toolkits.axisartist.grid_finder import FixedLocator, DictFormatter
5
5
6 from schainpy.model.graphics.jroplot_base import Plot, plt
6 from schainpy.model.graphics.jroplot_base import Plot, plt
7 from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot, SpectraCutPlot
7 from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot, SpectraCutPlot
8 from schainpy.utils import log
8 from schainpy.utils import log
9 # libreria wradlib
9 # libreria wradlib
10 import wradlib as wrl
10 import wradlib as wrl
11
11
12 EARTH_RADIUS = 6.3710e3
12 EARTH_RADIUS = 6.3710e3
13
13
14
14
15 def ll2xy(lat1, lon1, lat2, lon2):
15 def ll2xy(lat1, lon1, lat2, lon2):
16
16
17 p = 0.017453292519943295
17 p = 0.017453292519943295
18 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
18 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
19 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
19 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
20 r = 12742 * numpy.arcsin(numpy.sqrt(a))
20 r = 12742 * numpy.arcsin(numpy.sqrt(a))
21 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
21 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
22 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
22 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
23 theta = -theta + numpy.pi/2
23 theta = -theta + numpy.pi/2
24 return r*numpy.cos(theta), r*numpy.sin(theta)
24 return r*numpy.cos(theta), r*numpy.sin(theta)
25
25
26
26
27 def km2deg(km):
27 def km2deg(km):
28 '''
28 '''
29 Convert distance in km to degrees
29 Convert distance in km to degrees
30 '''
30 '''
31
31
32 return numpy.rad2deg(km/EARTH_RADIUS)
32 return numpy.rad2deg(km/EARTH_RADIUS)
33
33
34
34
35
35
36 class SpectralMomentsPlot(SpectraPlot):
36 class SpectralMomentsPlot(SpectraPlot):
37 '''
37 '''
38 Plot for Spectral Moments
38 Plot for Spectral Moments
39 '''
39 '''
40 CODE = 'spc_moments'
40 CODE = 'spc_moments'
41 # colormap = 'jet'
41 # colormap = 'jet'
42 # plot_type = 'pcolor'
42 # plot_type = 'pcolor'
43
43
44 class DobleGaussianPlot(SpectraPlot):
44 class DobleGaussianPlot(SpectraPlot):
45 '''
45 '''
46 Plot for Double Gaussian Plot
46 Plot for Double Gaussian Plot
47 '''
47 '''
48 CODE = 'gaussian_fit'
48 CODE = 'gaussian_fit'
49 # colormap = 'jet'
49 # colormap = 'jet'
50 # plot_type = 'pcolor'
50 # plot_type = 'pcolor'
51
51
52 class DoubleGaussianSpectraCutPlot(SpectraCutPlot):
52 class DoubleGaussianSpectraCutPlot(SpectraCutPlot):
53 '''
53 '''
54 Plot SpectraCut with Double Gaussian Fit
54 Plot SpectraCut with Double Gaussian Fit
55 '''
55 '''
56 CODE = 'cut_gaussian_fit'
56 CODE = 'cut_gaussian_fit'
57
57
58 class SnrPlot(RTIPlot):
58 class SnrPlot(RTIPlot):
59 '''
59 '''
60 Plot for SNR Data
60 Plot for SNR Data
61 '''
61 '''
62
62
63 CODE = 'snr'
63 CODE = 'snr'
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 'snr': 10*numpy.log10(dataOut.data_snr)
69 'snr': 10*numpy.log10(dataOut.data_snr)
70 }
70 }
71
71
72 return data, {}
72 return data, {}
73
73
74 class DopplerPlot(RTIPlot):
74 class DopplerPlot(RTIPlot):
75 '''
75 '''
76 Plot for DOPPLER Data (1st moment)
76 Plot for DOPPLER Data (1st moment)
77 '''
77 '''
78
78
79 CODE = 'dop'
79 CODE = 'dop'
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 'dop': 10*numpy.log10(dataOut.data_dop)
85 'dop': 10*numpy.log10(dataOut.data_dop)
86 }
86 }
87
87
88 return data, {}
88 return data, {}
89
89
90 class PowerPlot(RTIPlot):
90 class PowerPlot(RTIPlot):
91 '''
91 '''
92 Plot for Power Data (0 moment)
92 Plot for Power Data (0 moment)
93 '''
93 '''
94
94
95 CODE = 'pow'
95 CODE = 'pow'
96 colormap = 'jet'
96 colormap = 'jet'
97
97
98 def update(self, dataOut):
98 def update(self, dataOut):
99 data = {
99 data = {
100 'pow': 10*numpy.log10(dataOut.data_pow/dataOut.normFactor)
100 'pow': 10*numpy.log10(dataOut.data_pow/dataOut.normFactor)
101 }
101 }
102 return data, {}
102 return data, {}
103
103
104 class SpectralWidthPlot(RTIPlot):
104 class SpectralWidthPlot(RTIPlot):
105 '''
105 '''
106 Plot for Spectral Width Data (2nd moment)
106 Plot for Spectral Width Data (2nd moment)
107 '''
107 '''
108
108
109 CODE = 'width'
109 CODE = 'width'
110 colormap = 'jet'
110 colormap = 'jet'
111
111
112 def update(self, dataOut):
112 def update(self, dataOut):
113
113
114 data = {
114 data = {
115 'width': dataOut.data_width
115 'width': dataOut.data_width
116 }
116 }
117
117
118 return data, {}
118 return data, {}
119
119
120 class SkyMapPlot(Plot):
120 class SkyMapPlot(Plot):
121 '''
121 '''
122 Plot for meteors detection data
122 Plot for meteors detection data
123 '''
123 '''
124
124
125 CODE = 'param'
125 CODE = 'param'
126
126
127 def setup(self):
127 def setup(self):
128
128
129 self.ncols = 1
129 self.ncols = 1
130 self.nrows = 1
130 self.nrows = 1
131 self.width = 7.2
131 self.width = 7.2
132 self.height = 7.2
132 self.height = 7.2
133 self.nplots = 1
133 self.nplots = 1
134 self.xlabel = 'Zonal Zenith Angle (deg)'
134 self.xlabel = 'Zonal Zenith Angle (deg)'
135 self.ylabel = 'Meridional Zenith Angle (deg)'
135 self.ylabel = 'Meridional Zenith Angle (deg)'
136 self.polar = True
136 self.polar = True
137 self.ymin = -180
137 self.ymin = -180
138 self.ymax = 180
138 self.ymax = 180
139 self.colorbar = False
139 self.colorbar = False
140
140
141 def plot(self):
141 def plot(self):
142
142
143 arrayParameters = numpy.concatenate(self.data['param'])
143 arrayParameters = numpy.concatenate(self.data['param'])
144 error = arrayParameters[:, -1]
144 error = arrayParameters[:, -1]
145 indValid = numpy.where(error == 0)[0]
145 indValid = numpy.where(error == 0)[0]
146 finalMeteor = arrayParameters[indValid, :]
146 finalMeteor = arrayParameters[indValid, :]
147 finalAzimuth = finalMeteor[:, 3]
147 finalAzimuth = finalMeteor[:, 3]
148 finalZenith = finalMeteor[:, 4]
148 finalZenith = finalMeteor[:, 4]
149
149
150 x = finalAzimuth * numpy.pi / 180
150 x = finalAzimuth * numpy.pi / 180
151 y = finalZenith
151 y = finalZenith
152
152
153 ax = self.axes[0]
153 ax = self.axes[0]
154
154
155 if ax.firsttime:
155 if ax.firsttime:
156 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
156 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
157 else:
157 else:
158 ax.plot.set_data(x, y)
158 ax.plot.set_data(x, y)
159
159
160 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
160 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
161 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
161 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
162 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
162 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
163 dt2,
163 dt2,
164 len(x))
164 len(x))
165 self.titles[0] = title
165 self.titles[0] = title
166
166
167
167
168 class GenericRTIPlot(Plot):
168 class GenericRTIPlot(Plot):
169 '''
169 '''
170 Plot for data_xxxx object
170 Plot for data_xxxx object
171 '''
171 '''
172
172
173 CODE = 'param'
173 CODE = 'param'
174 colormap = 'viridis'
174 colormap = 'viridis'
175 plot_type = 'pcolorbuffer'
175 plot_type = 'pcolorbuffer'
176
176
177 def setup(self):
177 def setup(self):
178 self.xaxis = 'time'
178 self.xaxis = 'time'
179 self.ncols = 1
179 self.ncols = 1
180 self.nrows = self.data.shape('param')[0]
180 self.nrows = self.data.shape('param')[0]
181 self.nplots = self.nrows
181 self.nplots = self.nrows
182 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95})
182 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95})
183
183
184 if not self.xlabel:
184 if not self.xlabel:
185 self.xlabel = 'Time'
185 self.xlabel = 'Time'
186
186
187 self.ylabel = 'Range [km]'
187 self.ylabel = 'Range [km]'
188 if not self.titles:
188 if not self.titles:
189 self.titles = ['Param {}'.format(x) for x in range(self.nrows)]
189 self.titles = ['Param {}'.format(x) for x in range(self.nrows)]
190
190
191 def update(self, dataOut):
191 def update(self, dataOut):
192
192
193 data = {
193 data = {
194 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0)
194 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0)
195 }
195 }
196
196
197 meta = {}
197 meta = {}
198
198
199 return data, meta
199 return data, meta
200
200
201 def plot(self):
201 def plot(self):
202 # self.data.normalize_heights()
202 # self.data.normalize_heights()
203 self.x = self.data.times
203 self.x = self.data.times
204 self.y = self.data.yrange
204 self.y = self.data.yrange
205 self.z = self.data['param']
205 self.z = self.data['param']
206 self.z = 10*numpy.log10(self.z)
206 self.z = 10*numpy.log10(self.z)
207 self.z = numpy.ma.masked_invalid(self.z)
207 self.z = numpy.ma.masked_invalid(self.z)
208
208
209 if self.decimation is None:
209 if self.decimation is None:
210 x, y, z = self.fill_gaps(self.x, self.y, self.z)
210 x, y, z = self.fill_gaps(self.x, self.y, self.z)
211 else:
211 else:
212 x, y, z = self.fill_gaps(*self.decimate())
212 x, y, z = self.fill_gaps(*self.decimate())
213
213
214 for n, ax in enumerate(self.axes):
214 for n, ax in enumerate(self.axes):
215
215
216 self.zmax = self.zmax if self.zmax is not None else numpy.max(
216 self.zmax = self.zmax if self.zmax is not None else numpy.max(
217 self.z[n])
217 self.z[n])
218 self.zmin = self.zmin if self.zmin is not None else numpy.min(
218 self.zmin = self.zmin if self.zmin is not None else numpy.min(
219 self.z[n])
219 self.z[n])
220
220
221 if ax.firsttime:
221 if ax.firsttime:
222 if self.zlimits is not None:
222 if self.zlimits is not None:
223 self.zmin, self.zmax = self.zlimits[n]
223 self.zmin, self.zmax = self.zlimits[n]
224
224
225 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
225 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
226 vmin=self.zmin,
226 vmin=self.zmin,
227 vmax=self.zmax,
227 vmax=self.zmax,
228 cmap=self.cmaps[n]
228 cmap=self.cmaps[n]
229 )
229 )
230 else:
230 else:
231 if self.zlimits is not None:
231 if self.zlimits is not None:
232 self.zmin, self.zmax = self.zlimits[n]
232 self.zmin, self.zmax = self.zlimits[n]
233 ax.collections.remove(ax.collections[0])
233 ax.collections.remove(ax.collections[0])
234 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
234 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
235 vmin=self.zmin,
235 vmin=self.zmin,
236 vmax=self.zmax,
236 vmax=self.zmax,
237 cmap=self.cmaps[n]
237 cmap=self.cmaps[n]
238 )
238 )
239
239
240
240
241 class PolarMapPlot(Plot):
241 class PolarMapPlot(Plot):
242 '''
242 '''
243 Plot for weather radar
243 Plot for weather radar
244 '''
244 '''
245
245
246 CODE = 'param'
246 CODE = 'param'
247 colormap = 'seismic'
247 colormap = 'seismic'
248
248
249 def setup(self):
249 def setup(self):
250 self.ncols = 1
250 self.ncols = 1
251 self.nrows = 1
251 self.nrows = 1
252 self.width = 9
252 self.width = 9
253 self.height = 8
253 self.height = 8
254 self.mode = self.data.meta['mode']
254 self.mode = self.data.meta['mode']
255 if self.channels is not None:
255 if self.channels is not None:
256 self.nplots = len(self.channels)
256 self.nplots = len(self.channels)
257 self.nrows = len(self.channels)
257 self.nrows = len(self.channels)
258 else:
258 else:
259 self.nplots = self.data.shape(self.CODE)[0]
259 self.nplots = self.data.shape(self.CODE)[0]
260 self.nrows = self.nplots
260 self.nrows = self.nplots
261 self.channels = list(range(self.nplots))
261 self.channels = list(range(self.nplots))
262 if self.mode == 'E':
262 if self.mode == 'E':
263 self.xlabel = 'Longitude'
263 self.xlabel = 'Longitude'
264 self.ylabel = 'Latitude'
264 self.ylabel = 'Latitude'
265 else:
265 else:
266 self.xlabel = 'Range (km)'
266 self.xlabel = 'Range (km)'
267 self.ylabel = 'Height (km)'
267 self.ylabel = 'Height (km)'
268 self.bgcolor = 'white'
268 self.bgcolor = 'white'
269 self.cb_labels = self.data.meta['units']
269 self.cb_labels = self.data.meta['units']
270 self.lat = self.data.meta['latitude']
270 self.lat = self.data.meta['latitude']
271 self.lon = self.data.meta['longitude']
271 self.lon = self.data.meta['longitude']
272 self.xmin, self.xmax = float(
272 self.xmin, self.xmax = float(
273 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
273 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
274 self.ymin, self.ymax = float(
274 self.ymin, self.ymax = float(
275 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
275 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
276 # self.polar = True
276 # self.polar = True
277
277
278 def plot(self):
278 def plot(self):
279
279
280 for n, ax in enumerate(self.axes):
280 for n, ax in enumerate(self.axes):
281 data = self.data['param'][self.channels[n]]
281 data = self.data['param'][self.channels[n]]
282
282
283 zeniths = numpy.linspace(
283 zeniths = numpy.linspace(
284 0, self.data.meta['max_range'], data.shape[1])
284 0, self.data.meta['max_range'], data.shape[1])
285 if self.mode == 'E':
285 if self.mode == 'E':
286 azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2
286 azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2
287 r, theta = numpy.meshgrid(zeniths, azimuths)
287 r, theta = numpy.meshgrid(zeniths, azimuths)
288 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
288 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
289 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
289 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
290 x = km2deg(x) + self.lon
290 x = km2deg(x) + self.lon
291 y = km2deg(y) + self.lat
291 y = km2deg(y) + self.lat
292 else:
292 else:
293 azimuths = numpy.radians(self.data.yrange)
293 azimuths = numpy.radians(self.data.yrange)
294 r, theta = numpy.meshgrid(zeniths, azimuths)
294 r, theta = numpy.meshgrid(zeniths, azimuths)
295 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
295 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
296 self.y = zeniths
296 self.y = zeniths
297
297
298 if ax.firsttime:
298 if ax.firsttime:
299 if self.zlimits is not None:
299 if self.zlimits is not None:
300 self.zmin, self.zmax = self.zlimits[n]
300 self.zmin, self.zmax = self.zlimits[n]
301 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
301 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
302 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
302 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
303 vmin=self.zmin,
303 vmin=self.zmin,
304 vmax=self.zmax,
304 vmax=self.zmax,
305 cmap=self.cmaps[n])
305 cmap=self.cmaps[n])
306 else:
306 else:
307 if self.zlimits is not None:
307 if self.zlimits is not None:
308 self.zmin, self.zmax = self.zlimits[n]
308 self.zmin, self.zmax = self.zlimits[n]
309 ax.collections.remove(ax.collections[0])
309 ax.collections.remove(ax.collections[0])
310 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
310 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
311 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
311 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
312 vmin=self.zmin,
312 vmin=self.zmin,
313 vmax=self.zmax,
313 vmax=self.zmax,
314 cmap=self.cmaps[n])
314 cmap=self.cmaps[n])
315
315
316 if self.mode == 'A':
316 if self.mode == 'A':
317 continue
317 continue
318
318
319 # plot district names
319 # plot district names
320 f = open('/data/workspace/schain_scripts/distrito.csv')
320 f = open('/data/workspace/schain_scripts/distrito.csv')
321 for line in f:
321 for line in f:
322 label, lon, lat = [s.strip() for s in line.split(',') if s]
322 label, lon, lat = [s.strip() for s in line.split(',') if s]
323 lat = float(lat)
323 lat = float(lat)
324 lon = float(lon)
324 lon = float(lon)
325 # ax.plot(lon, lat, '.b', ms=2)
325 # ax.plot(lon, lat, '.b', ms=2)
326 ax.text(lon, lat, label.decode('utf8'), ha='center',
326 ax.text(lon, lat, label.decode('utf8'), ha='center',
327 va='bottom', size='8', color='black')
327 va='bottom', size='8', color='black')
328
328
329 # plot limites
329 # plot limites
330 limites = []
330 limites = []
331 tmp = []
331 tmp = []
332 for line in open('/data/workspace/schain_scripts/lima.csv'):
332 for line in open('/data/workspace/schain_scripts/lima.csv'):
333 if '#' in line:
333 if '#' in line:
334 if tmp:
334 if tmp:
335 limites.append(tmp)
335 limites.append(tmp)
336 tmp = []
336 tmp = []
337 continue
337 continue
338 values = line.strip().split(',')
338 values = line.strip().split(',')
339 tmp.append((float(values[0]), float(values[1])))
339 tmp.append((float(values[0]), float(values[1])))
340 for points in limites:
340 for points in limites:
341 ax.add_patch(
341 ax.add_patch(
342 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
342 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
343
343
344 # plot Cuencas
344 # plot Cuencas
345 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
345 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
346 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
346 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
347 values = [line.strip().split(',') for line in f]
347 values = [line.strip().split(',') for line in f]
348 points = [(float(s[0]), float(s[1])) for s in values]
348 points = [(float(s[0]), float(s[1])) for s in values]
349 ax.add_patch(Polygon(points, ec='b', fc='none'))
349 ax.add_patch(Polygon(points, ec='b', fc='none'))
350
350
351 # plot grid
351 # plot grid
352 for r in (15, 30, 45, 60):
352 for r in (15, 30, 45, 60):
353 ax.add_artist(plt.Circle((self.lon, self.lat),
353 ax.add_artist(plt.Circle((self.lon, self.lat),
354 km2deg(r), color='0.6', fill=False, lw=0.2))
354 km2deg(r), color='0.6', fill=False, lw=0.2))
355 ax.text(
355 ax.text(
356 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
356 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
357 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
357 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
358 '{}km'.format(r),
358 '{}km'.format(r),
359 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
359 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
360
360
361 if self.mode == 'E':
361 if self.mode == 'E':
362 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
362 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
363 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
363 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
364 else:
364 else:
365 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
365 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
366 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
366 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
367
367
368 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
368 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
369 self.titles = ['{} {}'.format(
369 self.titles = ['{} {}'.format(
370 self.data.parameters[x], title) for x in self.channels]
370 self.data.parameters[x], title) for x in self.channels]
371
371
372 class WeatherPlot(Plot):
372 class WeatherPlot(Plot):
373 CODE = 'weather'
373 CODE = 'weather'
374 plot_name = 'weather'
374 plot_name = 'weather'
375 plot_type = 'ppistyle'
375 plot_type = 'ppistyle'
376 buffering = False
376 buffering = False
377
377
378 def setup(self):
378 def setup(self):
379 self.ncols = 1
379 self.ncols = 1
380 self.nrows = 1
380 self.nrows = 1
381 self.width =8
381 self.width =8
382 self.height =8
382 self.height =8
383 self.nplots= 1
383 self.nplots= 1
384 self.ylabel= 'Range [Km]'
384 self.ylabel= 'Range [Km]'
385 self.titles= ['Weather']
385 self.titles= ['Weather']
386 self.colorbar=False
386 self.colorbar=False
387 self.ini =0
387 self.ini =0
388 self.len_azi =0
388 self.len_azi =0
389 self.buffer_ini = None
389 self.buffer_ini = None
390 self.buffer_azi = None
390 self.buffer_azi = None
391 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
391 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
392 self.flag =0
392 self.flag =0
393 self.indicador= 0
393 self.indicador= 0
394 self.last_data_azi = None
394 self.last_data_azi = None
395 self.val_mean = None
395 self.val_mean = None
396
396
397 def update(self, dataOut):
397 def update(self, dataOut):
398
398
399 data = {}
399 data = {}
400 meta = {}
400 meta = {}
401 if hasattr(dataOut, 'dataPP_POWER'):
401 if hasattr(dataOut, 'dataPP_POWER'):
402 factor = 1
402 factor = 1
403 if hasattr(dataOut, 'nFFTPoints'):
403 if hasattr(dataOut, 'nFFTPoints'):
404 factor = dataOut.normFactor
404 factor = dataOut.normFactor
405 #print("DIME EL SHAPE PORFAVOR",dataOut.data_360.shape)
405 #print("DIME EL SHAPE PORFAVOR",dataOut.data_360.shape)
406 data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
406 data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
407 data['azi'] = dataOut.data_azi
407 data['azi'] = dataOut.data_azi
408 data['ele'] = dataOut.data_ele
408 data['ele'] = dataOut.data_ele
409 return data, meta
409 return data, meta
410
410
411 def get2List(self,angulos):
411 def get2List(self,angulos):
412 list1=[]
412 list1=[]
413 list2=[]
413 list2=[]
414 for i in reversed(range(len(angulos))):
414 for i in reversed(range(len(angulos))):
415 diff_ = angulos[i]-angulos[i-1]
415 diff_ = angulos[i]-angulos[i-1]
416 if diff_ >1.5:
416 if diff_ >1.5:
417 list1.append(i-1)
417 list1.append(i-1)
418 list2.append(diff_)
418 list2.append(diff_)
419 return list(reversed(list1)),list(reversed(list2))
419 return list(reversed(list1)),list(reversed(list2))
420
420
421 def fixData360(self,list_,ang_):
421 def fixData360(self,list_,ang_):
422 if list_[0]==-1:
422 if list_[0]==-1:
423 vec = numpy.where(ang_<ang_[0])
423 vec = numpy.where(ang_<ang_[0])
424 ang_[vec] = ang_[vec]+360
424 ang_[vec] = ang_[vec]+360
425 return ang_
425 return ang_
426 return ang_
426 return ang_
427
427
428 def fixData360HL(self,angulos):
428 def fixData360HL(self,angulos):
429 vec = numpy.where(angulos>=360)
429 vec = numpy.where(angulos>=360)
430 angulos[vec]=angulos[vec]-360
430 angulos[vec]=angulos[vec]-360
431 return angulos
431 return angulos
432
432
433 def search_pos(self,pos,list_):
433 def search_pos(self,pos,list_):
434 for i in range(len(list_)):
434 for i in range(len(list_)):
435 if pos == list_[i]:
435 if pos == list_[i]:
436 return True,i
436 return True,i
437 i=None
437 i=None
438 return False,i
438 return False,i
439
439
440 def fixDataComp(self,ang_,list1_,list2_):
440 def fixDataComp(self,ang_,list1_,list2_):
441 size = len(ang_)
441 size = len(ang_)
442 size2 = 0
442 size2 = 0
443 for i in range(len(list2_)):
443 for i in range(len(list2_)):
444 size2=size2+round(list2_[i])-1
444 size2=size2+round(list2_[i])-1
445 new_size= size+size2
445 new_size= size+size2
446 ang_new = numpy.zeros(new_size)
446 ang_new = numpy.zeros(new_size)
447 ang_new2 = numpy.zeros(new_size)
447 ang_new2 = numpy.zeros(new_size)
448
448
449 tmp = 0
449 tmp = 0
450 c = 0
450 c = 0
451 for i in range(len(ang_)):
451 for i in range(len(ang_)):
452 ang_new[tmp +c] = ang_[i]
452 ang_new[tmp +c] = ang_[i]
453 ang_new2[tmp+c] = ang_[i]
453 ang_new2[tmp+c] = ang_[i]
454 condition , value = self.search_pos(i,list1_)
454 condition , value = self.search_pos(i,list1_)
455 if condition:
455 if condition:
456 pos = tmp + c + 1
456 pos = tmp + c + 1
457 for k in range(round(list2_[value])-1):
457 for k in range(round(list2_[value])-1):
458 ang_new[pos+k] = ang_new[pos+k-1]+1
458 ang_new[pos+k] = ang_new[pos+k-1]+1
459 ang_new2[pos+k] = numpy.nan
459 ang_new2[pos+k] = numpy.nan
460 tmp = pos +k
460 tmp = pos +k
461 c = 0
461 c = 0
462 c=c+1
462 c=c+1
463 return ang_new,ang_new2
463 return ang_new,ang_new2
464
464
465 def globalCheckPED(self,angulos):
465 def globalCheckPED(self,angulos):
466 l1,l2 = self.get2List(angulos)
466 l1,l2 = self.get2List(angulos)
467 if len(l1)>0:
467 if len(l1)>0:
468 angulos2 = self.fixData360(list_=l1,ang_=angulos)
468 angulos2 = self.fixData360(list_=l1,ang_=angulos)
469 l1,l2 = self.get2List(angulos2)
469 l1,l2 = self.get2List(angulos2)
470
470
471 ang1_,ang2_ = self.fixDataComp(ang_=angulos2,list1_=l1,list2_=l2)
471 ang1_,ang2_ = self.fixDataComp(ang_=angulos2,list1_=l1,list2_=l2)
472 ang1_ = self.fixData360HL(ang1_)
472 ang1_ = self.fixData360HL(ang1_)
473 ang2_ = self.fixData360HL(ang2_)
473 ang2_ = self.fixData360HL(ang2_)
474 else:
474 else:
475 ang1_= angulos
475 ang1_= angulos
476 ang2_= angulos
476 ang2_= angulos
477 return ang1_,ang2_
477 return ang1_,ang2_
478
478
479 def analizeDATA(self,data_azi):
479 def analizeDATA(self,data_azi):
480 list1 = []
480 list1 = []
481 list2 = []
481 list2 = []
482 dat = data_azi
482 dat = data_azi
483 for i in reversed(range(1,len(dat))):
483 for i in reversed(range(1,len(dat))):
484 if dat[i]>dat[i-1]:
484 if dat[i]>dat[i-1]:
485 diff = int(dat[i])-int(dat[i-1])
485 diff = int(dat[i])-int(dat[i-1])
486 else:
486 else:
487 diff = 360+int(dat[i])-int(dat[i-1])
487 diff = 360+int(dat[i])-int(dat[i-1])
488 if diff > 1:
488 if diff > 1:
489 list1.append(i-1)
489 list1.append(i-1)
490 list2.append(diff-1)
490 list2.append(diff-1)
491 return list1,list2
491 return list1,list2
492
492
493 def fixDATANEW(self,data_azi,data_weather):
493 def fixDATANEW(self,data_azi,data_weather):
494 list1,list2 = self.analizeDATA(data_azi)
494 list1,list2 = self.analizeDATA(data_azi)
495 if len(list1)== 0:
495 if len(list1)== 0:
496 return data_azi,data_weather
496 return data_azi,data_weather
497 else:
497 else:
498 resize = 0
498 resize = 0
499 for i in range(len(list2)):
499 for i in range(len(list2)):
500 resize= resize + list2[i]
500 resize= resize + list2[i]
501 new_data_azi = numpy.resize(data_azi,resize)
501 new_data_azi = numpy.resize(data_azi,resize)
502 new_data_weather= numpy.resize(date_weather,resize)
502 new_data_weather= numpy.resize(date_weather,resize)
503
503
504 for i in range(len(list2)):
504 for i in range(len(list2)):
505 j=0
505 j=0
506 position=list1[i]+1
506 position=list1[i]+1
507 for j in range(list2[i]):
507 for j in range(list2[i]):
508 new_data_azi[position+j]=new_data_azi[position+j-1]+1
508 new_data_azi[position+j]=new_data_azi[position+j-1]+1
509 return new_data_azi
509 return new_data_azi
510
510
511 def fixDATA(self,data_azi):
511 def fixDATA(self,data_azi):
512 data=data_azi
512 data=data_azi
513 for i in range(len(data)):
513 for i in range(len(data)):
514 if numpy.isnan(data[i]):
514 if numpy.isnan(data[i]):
515 data[i]=data[i-1]+1
515 data[i]=data[i-1]+1
516 return data
516 return data
517
517
518 def replaceNAN(self,data_weather,data_azi,val):
518 def replaceNAN(self,data_weather,data_azi,val):
519 data= data_azi
519 data= data_azi
520 data_T= data_weather
520 data_T= data_weather
521 if data.shape[0]> data_T.shape[0]:
521 if data.shape[0]> data_T.shape[0]:
522 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
522 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
523 c = 0
523 c = 0
524 for i in range(len(data)):
524 for i in range(len(data)):
525 if numpy.isnan(data[i]):
525 if numpy.isnan(data[i]):
526 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
526 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
527 else:
527 else:
528 data_N[i,:]=data_T[c,:]
528 data_N[i,:]=data_T[c,:]
529 c=c+1
529 c=c+1
530 return data_N
530 return data_N
531 else:
531 else:
532 for i in range(len(data)):
532 for i in range(len(data)):
533 if numpy.isnan(data[i]):
533 if numpy.isnan(data[i]):
534 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
534 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
535 return data_T
535 return data_T
536
536
537 def const_ploteo(self,data_weather,data_azi,step,res):
537 def const_ploteo(self,data_weather,data_azi,step,res):
538 if self.ini==0:
538 if self.ini==0:
539 #-------
539 #-------
540 n = (360/res)-len(data_azi)
540 n = (360/res)-len(data_azi)
541 #--------------------- new -------------------------
541 #--------------------- new -------------------------
542 data_azi_new ,data_azi_old= self.globalCheckPED(data_azi)
542 data_azi_new ,data_azi_old= self.globalCheckPED(data_azi)
543 #------------------------
543 #------------------------
544 start = data_azi_new[-1] + res
544 start = data_azi_new[-1] + res
545 end = data_azi_new[0] - res
545 end = data_azi_new[0] - res
546 #------ new
546 #------ new
547 self.last_data_azi = end
547 self.last_data_azi = end
548 if start>end:
548 if start>end:
549 end = end + 360
549 end = end + 360
550 azi_vacia = numpy.linspace(start,end,int(n))
550 azi_vacia = numpy.linspace(start,end,int(n))
551 azi_vacia = numpy.where(azi_vacia>360,azi_vacia-360,azi_vacia)
551 azi_vacia = numpy.where(azi_vacia>360,azi_vacia-360,azi_vacia)
552 data_azi = numpy.hstack((data_azi_new,azi_vacia))
552 data_azi = numpy.hstack((data_azi_new,azi_vacia))
553 # RADAR
553 # RADAR
554 val_mean = numpy.mean(data_weather[:,-1])
554 val_mean = numpy.mean(data_weather[:,-1])
555 self.val_mean = val_mean
555 self.val_mean = val_mean
556 data_weather_cmp = numpy.ones([(360-data_weather.shape[0]),data_weather.shape[1]])*val_mean
556 data_weather_cmp = numpy.ones([(360-data_weather.shape[0]),data_weather.shape[1]])*val_mean
557 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
557 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
558 data_weather = numpy.vstack((data_weather,data_weather_cmp))
558 data_weather = numpy.vstack((data_weather,data_weather_cmp))
559 else:
559 else:
560 # azimuth
560 # azimuth
561 flag=0
561 flag=0
562 start_azi = self.res_azi[0]
562 start_azi = self.res_azi[0]
563 #-----------new------------
563 #-----------new------------
564 data_azi ,data_azi_old= self.globalCheckPED(data_azi)
564 data_azi ,data_azi_old= self.globalCheckPED(data_azi)
565 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
565 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
566 #--------------------------
566 #--------------------------
567 start = data_azi[0]
567 start = data_azi[0]
568 end = data_azi[-1]
568 end = data_azi[-1]
569 self.last_data_azi= end
569 self.last_data_azi= end
570 if start< start_azi:
570 if start< start_azi:
571 start = start +360
571 start = start +360
572 if end <start_azi:
572 if end <start_azi:
573 end = end +360
573 end = end +360
574
574
575 pos_ini = int((start-start_azi)/res)
575 pos_ini = int((start-start_azi)/res)
576 len_azi = len(data_azi)
576 len_azi = len(data_azi)
577 if (360-pos_ini)<len_azi:
577 if (360-pos_ini)<len_azi:
578 if pos_ini+1==360:
578 if pos_ini+1==360:
579 pos_ini=0
579 pos_ini=0
580 else:
580 else:
581 flag=1
581 flag=1
582 dif= 360-pos_ini
582 dif= 360-pos_ini
583 comp= len_azi-dif
583 comp= len_azi-dif
584 #-----------------
584 #-----------------
585 if flag==0:
585 if flag==0:
586 # AZIMUTH
586 # AZIMUTH
587 self.res_azi[pos_ini:pos_ini+len_azi] = data_azi
587 self.res_azi[pos_ini:pos_ini+len_azi] = data_azi
588 # RADAR
588 # RADAR
589 self.res_weather[pos_ini:pos_ini+len_azi,:] = data_weather
589 self.res_weather[pos_ini:pos_ini+len_azi,:] = data_weather
590 else:
590 else:
591 # AZIMUTH
591 # AZIMUTH
592 self.res_azi[pos_ini:pos_ini+dif] = data_azi[0:dif]
592 self.res_azi[pos_ini:pos_ini+dif] = data_azi[0:dif]
593 self.res_azi[0:comp] = data_azi[dif:]
593 self.res_azi[0:comp] = data_azi[dif:]
594 # RADAR
594 # RADAR
595 self.res_weather[pos_ini:pos_ini+dif,:] = data_weather[0:dif,:]
595 self.res_weather[pos_ini:pos_ini+dif,:] = data_weather[0:dif,:]
596 self.res_weather[0:comp,:] = data_weather[dif:,:]
596 self.res_weather[0:comp,:] = data_weather[dif:,:]
597 flag=0
597 flag=0
598 data_azi = self.res_azi
598 data_azi = self.res_azi
599 data_weather = self.res_weather
599 data_weather = self.res_weather
600
600
601 return data_weather,data_azi
601 return data_weather,data_azi
602
602
603 def plot(self):
603 def plot(self):
604 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
604 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
605 data = self.data[-1]
605 data = self.data[-1]
606 r = self.data.yrange
606 r = self.data.yrange
607 delta_height = r[1]-r[0]
607 delta_height = r[1]-r[0]
608 r_mask = numpy.where(r>=0)[0]
608 r_mask = numpy.where(r>=0)[0]
609 r = numpy.arange(len(r_mask))*delta_height
609 r = numpy.arange(len(r_mask))*delta_height
610 self.y = 2*r
610 self.y = 2*r
611 # RADAR
611 # RADAR
612 #data_weather = data['weather']
612 #data_weather = data['weather']
613 # PEDESTAL
613 # PEDESTAL
614 #data_azi = data['azi']
614 #data_azi = data['azi']
615 res = 1
615 res = 1
616 # STEP
616 # STEP
617 step = (360/(res*data['weather'].shape[0]))
617 step = (360/(res*data['weather'].shape[0]))
618
618
619 self.res_weather, self.res_azi = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_azi=data['azi'],step=step,res=res)
619 self.res_weather, self.res_azi = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_azi=data['azi'],step=step,res=res)
620 self.res_ele = numpy.mean(data['ele'])
620 self.res_ele = numpy.mean(data['ele'])
621 ################# PLOTEO ###################
621 ################# PLOTEO ###################
622 for i,ax in enumerate(self.axes):
622 for i,ax in enumerate(self.axes):
623 self.zmin = self.zmin if self.zmin else 20
624 self.zmax = self.zmax if self.zmax else 80
623 if ax.firsttime:
625 if ax.firsttime:
624 plt.clf()
626 plt.clf()
625 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=20, vmax=80)
627 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=self.zmin, vmax=self.zmax)
626 else:
628 else:
627 plt.clf()
629 plt.clf()
628 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=20, vmax=80)
630 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=self.zmin, vmax=self.zmax)
629 caax = cgax.parasites[0]
631 caax = cgax.parasites[0]
630 paax = cgax.parasites[1]
632 paax = cgax.parasites[1]
631 cbar = plt.gcf().colorbar(pm, pad=0.075)
633 cbar = plt.gcf().colorbar(pm, pad=0.075)
632 caax.set_xlabel('x_range [km]')
634 caax.set_xlabel('x_range [km]')
633 caax.set_ylabel('y_range [km]')
635 caax.set_ylabel('y_range [km]')
634 plt.text(1.0, 1.05, 'Azimuth '+str(thisDatetime)+" Step "+str(self.ini)+ " Elev: "+str(round(self.res_ele,2)), transform=caax.transAxes, va='bottom',ha='right')
636 plt.text(1.0, 1.05, 'Azimuth '+str(thisDatetime)+" Step "+str(self.ini)+ " EL: "+str(round(self.res_ele, 1)), transform=caax.transAxes, va='bottom',ha='right')
635
637
636 self.ini= self.ini+1
638 self.ini= self.ini+1
637
639
638
640
639 class WeatherRHIPlot(Plot):
641 class WeatherRHIPlot(Plot):
640 CODE = 'weather'
642 CODE = 'weather'
641 plot_name = 'weather'
643 plot_name = 'weather'
642 plot_type = 'rhistyle'
644 plot_type = 'rhistyle'
643 buffering = False
645 buffering = False
644 data_ele_tmp = None
646 data_ele_tmp = None
645
647
646 def setup(self):
648 def setup(self):
647 print("********************")
649 print("********************")
648 print("********************")
650 print("********************")
649 print("********************")
651 print("********************")
650 print("SETUP WEATHER PLOT")
652 print("SETUP WEATHER PLOT")
651 self.ncols = 1
653 self.ncols = 1
652 self.nrows = 1
654 self.nrows = 1
653 self.nplots= 1
655 self.nplots= 1
654 self.ylabel= 'Range [Km]'
656 self.ylabel= 'Range [Km]'
655 self.titles= ['Weather']
657 self.titles= ['Weather']
656 if self.channels is not None:
658 if self.channels is not None:
657 self.nplots = len(self.channels)
659 self.nplots = len(self.channels)
658 self.nrows = len(self.channels)
660 self.nrows = len(self.channels)
659 else:
661 else:
660 self.nplots = self.data.shape(self.CODE)[0]
662 self.nplots = self.data.shape(self.CODE)[0]
661 self.nrows = self.nplots
663 self.nrows = self.nplots
662 self.channels = list(range(self.nplots))
664 self.channels = list(range(self.nplots))
663 print("channels",self.channels)
665 print("channels",self.channels)
664 print("que saldra", self.data.shape(self.CODE)[0])
666 print("que saldra", self.data.shape(self.CODE)[0])
665 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
667 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
666 print("self.titles",self.titles)
668 print("self.titles",self.titles)
667 self.colorbar=False
669 self.colorbar=False
668 self.width =8
670 self.width =12
669 self.height =8
671 self.height =8
670 self.ini =0
672 self.ini =0
671 self.len_azi =0
673 self.len_azi =0
672 self.buffer_ini = None
674 self.buffer_ini = None
673 self.buffer_ele = None
675 self.buffer_ele = None
674 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
676 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
675 self.flag =0
677 self.flag =0
676 self.indicador= 0
678 self.indicador= 0
677 self.last_data_ele = None
679 self.last_data_ele = None
678 self.val_mean = None
680 self.val_mean = None
679
681
680 def update(self, dataOut):
682 def update(self, dataOut):
681
683
682 data = {}
684 data = {}
683 meta = {}
685 meta = {}
684 if hasattr(dataOut, 'dataPP_POWER'):
686 if hasattr(dataOut, 'dataPP_POWER'):
685 factor = 1
687 factor = 1
686 if hasattr(dataOut, 'nFFTPoints'):
688 if hasattr(dataOut, 'nFFTPoints'):
687 factor = dataOut.normFactor
689 factor = dataOut.normFactor
688 print("dataOut",dataOut.data_360.shape)
690 print("dataOut",dataOut.data_360.shape)
689 #
691 #
690 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
692 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
691 #
693 #
692 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
694 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
693 data['azi'] = dataOut.data_azi
695 data['azi'] = dataOut.data_azi
694 data['ele'] = dataOut.data_ele
696 data['ele'] = dataOut.data_ele
695 #print("UPDATE")
697 #print("UPDATE")
696 #print("data[weather]",data['weather'].shape)
698 #print("data[weather]",data['weather'].shape)
697 #print("data[azi]",data['azi'])
699 #print("data[azi]",data['azi'])
698 return data, meta
700 return data, meta
699
701
700 def get2List(self,angulos):
702 def get2List(self,angulos):
701 list1=[]
703 list1=[]
702 list2=[]
704 list2=[]
703 for i in reversed(range(len(angulos))):
705 for i in reversed(range(len(angulos))):
704 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
706 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
705 diff_ = angulos[i]-angulos[i-1]
707 diff_ = angulos[i]-angulos[i-1]
706 if abs(diff_) >1.5:
708 if abs(diff_) >1.5:
707 list1.append(i-1)
709 list1.append(i-1)
708 list2.append(diff_)
710 list2.append(diff_)
709 return list(reversed(list1)),list(reversed(list2))
711 return list(reversed(list1)),list(reversed(list2))
710
712
711 def fixData90(self,list_,ang_):
713 def fixData90(self,list_,ang_):
712 if list_[0]==-1:
714 if list_[0]==-1:
713 vec = numpy.where(ang_<ang_[0])
715 vec = numpy.where(ang_<ang_[0])
714 ang_[vec] = ang_[vec]+90
716 ang_[vec] = ang_[vec]+90
715 return ang_
717 return ang_
716 return ang_
718 return ang_
717
719
718 def fixData90HL(self,angulos):
720 def fixData90HL(self,angulos):
719 vec = numpy.where(angulos>=90)
721 vec = numpy.where(angulos>=90)
720 angulos[vec]=angulos[vec]-90
722 angulos[vec]=angulos[vec]-90
721 return angulos
723 return angulos
722
724
723
725
724 def search_pos(self,pos,list_):
726 def search_pos(self,pos,list_):
725 for i in range(len(list_)):
727 for i in range(len(list_)):
726 if pos == list_[i]:
728 if pos == list_[i]:
727 return True,i
729 return True,i
728 i=None
730 i=None
729 return False,i
731 return False,i
730
732
731 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
733 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
732 size = len(ang_)
734 size = len(ang_)
733 size2 = 0
735 size2 = 0
734 for i in range(len(list2_)):
736 for i in range(len(list2_)):
735 size2=size2+round(abs(list2_[i]))-1
737 size2=size2+round(abs(list2_[i]))-1
736 new_size= size+size2
738 new_size= size+size2
737 ang_new = numpy.zeros(new_size)
739 ang_new = numpy.zeros(new_size)
738 ang_new2 = numpy.zeros(new_size)
740 ang_new2 = numpy.zeros(new_size)
739
741
740 tmp = 0
742 tmp = 0
741 c = 0
743 c = 0
742 for i in range(len(ang_)):
744 for i in range(len(ang_)):
743 ang_new[tmp +c] = ang_[i]
745 ang_new[tmp +c] = ang_[i]
744 ang_new2[tmp+c] = ang_[i]
746 ang_new2[tmp+c] = ang_[i]
745 condition , value = self.search_pos(i,list1_)
747 condition , value = self.search_pos(i,list1_)
746 if condition:
748 if condition:
747 pos = tmp + c + 1
749 pos = tmp + c + 1
748 for k in range(round(abs(list2_[value]))-1):
750 for k in range(round(abs(list2_[value]))-1):
749 if tipo_case==0 or tipo_case==3:#subida
751 if tipo_case==0 or tipo_case==3:#subida
750 ang_new[pos+k] = ang_new[pos+k-1]+1
752 ang_new[pos+k] = ang_new[pos+k-1]+1
751 ang_new2[pos+k] = numpy.nan
753 ang_new2[pos+k] = numpy.nan
752 elif tipo_case==1 or tipo_case==2:#bajada
754 elif tipo_case==1 or tipo_case==2:#bajada
753 ang_new[pos+k] = ang_new[pos+k-1]-1
755 ang_new[pos+k] = ang_new[pos+k-1]-1
754 ang_new2[pos+k] = numpy.nan
756 ang_new2[pos+k] = numpy.nan
755
757
756 tmp = pos +k
758 tmp = pos +k
757 c = 0
759 c = 0
758 c=c+1
760 c=c+1
759 return ang_new,ang_new2
761 return ang_new,ang_new2
760
762
761 def globalCheckPED(self,angulos,tipo_case):
763 def globalCheckPED(self,angulos,tipo_case):
762 l1,l2 = self.get2List(angulos)
764 l1,l2 = self.get2List(angulos)
763 ##print("l1",l1)
765 ##print("l1",l1)
764 ##print("l2",l2)
766 ##print("l2",l2)
765 if len(l1)>0:
767 if len(l1)>0:
766 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
768 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
767 #l1,l2 = self.get2List(angulos2)
769 #l1,l2 = self.get2List(angulos2)
768 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
770 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
769 #ang1_ = self.fixData90HL(ang1_)
771 #ang1_ = self.fixData90HL(ang1_)
770 #ang2_ = self.fixData90HL(ang2_)
772 #ang2_ = self.fixData90HL(ang2_)
771 else:
773 else:
772 ang1_= angulos
774 ang1_= angulos
773 ang2_= angulos
775 ang2_= angulos
774 return ang1_,ang2_
776 return ang1_,ang2_
775
777
776
778
777 def replaceNAN(self,data_weather,data_ele,val):
779 def replaceNAN(self,data_weather,data_ele,val):
778 data= data_ele
780 data= data_ele
779 data_T= data_weather
781 data_T= data_weather
780 if data.shape[0]> data_T.shape[0]:
782 if data.shape[0]> data_T.shape[0]:
781 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
783 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
782 c = 0
784 c = 0
783 for i in range(len(data)):
785 for i in range(len(data)):
784 if numpy.isnan(data[i]):
786 if numpy.isnan(data[i]):
785 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
787 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
786 else:
788 else:
787 data_N[i,:]=data_T[c,:]
789 data_N[i,:]=data_T[c,:]
788 c=c+1
790 c=c+1
789 return data_N
791 return data_N
790 else:
792 else:
791 for i in range(len(data)):
793 for i in range(len(data)):
792 if numpy.isnan(data[i]):
794 if numpy.isnan(data[i]):
793 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
795 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
794 return data_T
796 return data_T
795
797
796 def check_case(self,data_ele,ang_max,ang_min):
798 def check_case(self,data_ele,ang_max,ang_min):
797 start = data_ele[0]
799 start = data_ele[0]
798 end = data_ele[-1]
800 end = data_ele[-1]
799 number = (end-start)
801 number = (end-start)
800 len_ang=len(data_ele)
802 len_ang=len(data_ele)
801 print("start",start)
803 print("start",start)
802 print("end",end)
804 print("end",end)
803 print("number",number)
805 print("number",number)
804
806
805 print("len_ang",len_ang)
807 print("len_ang",len_ang)
806
808
807 #exit(1)
809 #exit(1)
808
810
809 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
811 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
810 return 0
812 return 0
811 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
813 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
812 # return 1
814 # return 1
813 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
815 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
814 return 1
816 return 1
815 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
817 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
816 return 2
818 return 2
817 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
819 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
818 return 3
820 return 3
819
821
820
822
821 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min):
823 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min):
822 ang_max= ang_max
824 ang_max= ang_max
823 ang_min= ang_min
825 ang_min= ang_min
824 data_weather=data_weather
826 data_weather=data_weather
825 val_ch=val_ch
827 val_ch=val_ch
826 ##print("*********************DATA WEATHER**************************************")
828 ##print("*********************DATA WEATHER**************************************")
827 ##print(data_weather)
829 ##print(data_weather)
828 if self.ini==0:
830 if self.ini==0:
829 '''
831 '''
830 print("**********************************************")
832 print("**********************************************")
831 print("**********************************************")
833 print("**********************************************")
832 print("***************ini**************")
834 print("***************ini**************")
833 print("**********************************************")
835 print("**********************************************")
834 print("**********************************************")
836 print("**********************************************")
835 '''
837 '''
836 #print("data_ele",data_ele)
838 #print("data_ele",data_ele)
837 #----------------------------------------------------------
839 #----------------------------------------------------------
838 tipo_case = self.check_case(data_ele,ang_max,ang_min)
840 tipo_case = self.check_case(data_ele,ang_max,ang_min)
839 print("check_case",tipo_case)
841 print("check_case",tipo_case)
840 #exit(1)
842 #exit(1)
841 #--------------------- new -------------------------
843 #--------------------- new -------------------------
842 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
844 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
843
845
844 #-------------------------CAMBIOS RHI---------------------------------
846 #-------------------------CAMBIOS RHI---------------------------------
845 start= ang_min
847 start= ang_min
846 end = ang_max
848 end = ang_max
847 n= (ang_max-ang_min)/res
849 n= (ang_max-ang_min)/res
848 #------ new
850 #------ new
849 self.start_data_ele = data_ele_new[0]
851 self.start_data_ele = data_ele_new[0]
850 self.end_data_ele = data_ele_new[-1]
852 self.end_data_ele = data_ele_new[-1]
851 if tipo_case==0 or tipo_case==3: # SUBIDA
853 if tipo_case==0 or tipo_case==3: # SUBIDA
852 n1= round(self.start_data_ele)- start
854 n1= round(self.start_data_ele)- start
853 n2= end - round(self.end_data_ele)
855 n2= end - round(self.end_data_ele)
854 print(self.start_data_ele)
856 print(self.start_data_ele)
855 print(self.end_data_ele)
857 print(self.end_data_ele)
856 if n1>0:
858 if n1>0:
857 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
859 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
858 ele1_nan= numpy.ones(n1)*numpy.nan
860 ele1_nan= numpy.ones(n1)*numpy.nan
859 data_ele = numpy.hstack((ele1,data_ele_new))
861 data_ele = numpy.hstack((ele1,data_ele_new))
860 print("ele1_nan",ele1_nan.shape)
862 print("ele1_nan",ele1_nan.shape)
861 print("data_ele_old",data_ele_old.shape)
863 print("data_ele_old",data_ele_old.shape)
862 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
864 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
863 if n2>0:
865 if n2>0:
864 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
866 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
865 ele2_nan= numpy.ones(n2)*numpy.nan
867 ele2_nan= numpy.ones(n2)*numpy.nan
866 data_ele = numpy.hstack((data_ele,ele2))
868 data_ele = numpy.hstack((data_ele,ele2))
867 print("ele2_nan",ele2_nan.shape)
869 print("ele2_nan",ele2_nan.shape)
868 print("data_ele_old",data_ele_old.shape)
870 print("data_ele_old",data_ele_old.shape)
869 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
871 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
870
872
871 if tipo_case==1 or tipo_case==2: # BAJADA
873 if tipo_case==1 or tipo_case==2: # BAJADA
872 data_ele_new = data_ele_new[::-1] # reversa
874 data_ele_new = data_ele_new[::-1] # reversa
873 data_ele_old = data_ele_old[::-1]# reversa
875 data_ele_old = data_ele_old[::-1]# reversa
874 data_weather = data_weather[::-1,:]# reversa
876 data_weather = data_weather[::-1,:]# reversa
875 vec= numpy.where(data_ele_new<ang_max)
877 vec= numpy.where(data_ele_new<ang_max)
876 data_ele_new = data_ele_new[vec]
878 data_ele_new = data_ele_new[vec]
877 data_ele_old = data_ele_old[vec]
879 data_ele_old = data_ele_old[vec]
878 data_weather = data_weather[vec[0]]
880 data_weather = data_weather[vec[0]]
879 vec2= numpy.where(0<data_ele_new)
881 vec2= numpy.where(0<data_ele_new)
880 data_ele_new = data_ele_new[vec2]
882 data_ele_new = data_ele_new[vec2]
881 data_ele_old = data_ele_old[vec2]
883 data_ele_old = data_ele_old[vec2]
882 data_weather = data_weather[vec2[0]]
884 data_weather = data_weather[vec2[0]]
883 self.start_data_ele = data_ele_new[0]
885 self.start_data_ele = data_ele_new[0]
884 self.end_data_ele = data_ele_new[-1]
886 self.end_data_ele = data_ele_new[-1]
885
887
886 n1= round(self.start_data_ele)- start
888 n1= round(self.start_data_ele)- start
887 n2= end - round(self.end_data_ele)-1
889 n2= end - round(self.end_data_ele)-1
888 print(self.start_data_ele)
890 print(self.start_data_ele)
889 print(self.end_data_ele)
891 print(self.end_data_ele)
890 if n1>0:
892 if n1>0:
891 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
893 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
892 ele1_nan= numpy.ones(n1)*numpy.nan
894 ele1_nan= numpy.ones(n1)*numpy.nan
893 data_ele = numpy.hstack((ele1,data_ele_new))
895 data_ele = numpy.hstack((ele1,data_ele_new))
894 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
896 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
895 if n2>0:
897 if n2>0:
896 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
898 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
897 ele2_nan= numpy.ones(n2)*numpy.nan
899 ele2_nan= numpy.ones(n2)*numpy.nan
898 data_ele = numpy.hstack((data_ele,ele2))
900 data_ele = numpy.hstack((data_ele,ele2))
899 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
901 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
900 # RADAR
902 # RADAR
901 # NOTA data_ele y data_weather es la variable que retorna
903 # NOTA data_ele y data_weather es la variable que retorna
902 val_mean = numpy.mean(data_weather[:,-1])
904 val_mean = numpy.mean(data_weather[:,-1])
903 self.val_mean = val_mean
905 self.val_mean = val_mean
904 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
906 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
905 self.data_ele_tmp[val_ch]= data_ele_old
907 self.data_ele_tmp[val_ch]= data_ele_old
906 else:
908 else:
907 #print("**********************************************")
909 #print("**********************************************")
908 #print("****************VARIABLE**********************")
910 #print("****************VARIABLE**********************")
909 #-------------------------CAMBIOS RHI---------------------------------
911 #-------------------------CAMBIOS RHI---------------------------------
910 #---------------------------------------------------------------------
912 #---------------------------------------------------------------------
911 ##print("INPUT data_ele",data_ele)
913 ##print("INPUT data_ele",data_ele)
912 flag=0
914 flag=0
913 start_ele = self.res_ele[0]
915 start_ele = self.res_ele[0]
914 tipo_case = self.check_case(data_ele,ang_max,ang_min)
916 tipo_case = self.check_case(data_ele,ang_max,ang_min)
915 #print("TIPO DE DATA",tipo_case)
917 #print("TIPO DE DATA",tipo_case)
916 #-----------new------------
918 #-----------new------------
917 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
919 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
918 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
920 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
919
921
920 #-------------------------------NEW RHI ITERATIVO-------------------------
922 #-------------------------------NEW RHI ITERATIVO-------------------------
921
923
922 if tipo_case==0 : # SUBIDA
924 if tipo_case==0 : # SUBIDA
923 vec = numpy.where(data_ele<ang_max)
925 vec = numpy.where(data_ele<ang_max)
924 data_ele = data_ele[vec]
926 data_ele = data_ele[vec]
925 data_ele_old = data_ele_old[vec]
927 data_ele_old = data_ele_old[vec]
926 data_weather = data_weather[vec[0]]
928 data_weather = data_weather[vec[0]]
927
929
928 vec2 = numpy.where(0<data_ele)
930 vec2 = numpy.where(0<data_ele)
929 data_ele= data_ele[vec2]
931 data_ele= data_ele[vec2]
930 data_ele_old= data_ele_old[vec2]
932 data_ele_old= data_ele_old[vec2]
931 ##print(data_ele_new)
933 ##print(data_ele_new)
932 data_weather= data_weather[vec2[0]]
934 data_weather= data_weather[vec2[0]]
933
935
934 new_i_ele = int(round(data_ele[0]))
936 new_i_ele = int(round(data_ele[0]))
935 new_f_ele = int(round(data_ele[-1]))
937 new_f_ele = int(round(data_ele[-1]))
936 #print(new_i_ele)
938 #print(new_i_ele)
937 #print(new_f_ele)
939 #print(new_f_ele)
938 #print(data_ele,len(data_ele))
940 #print(data_ele,len(data_ele))
939 #print(data_ele_old,len(data_ele_old))
941 #print(data_ele_old,len(data_ele_old))
940 if new_i_ele< 2:
942 if new_i_ele< 2:
941 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
943 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
942 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
944 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
943 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
945 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
944 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
946 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
945 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
947 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
946 data_ele = self.res_ele
948 data_ele = self.res_ele
947 data_weather = self.res_weather[val_ch]
949 data_weather = self.res_weather[val_ch]
948
950
949 elif tipo_case==1 : #BAJADA
951 elif tipo_case==1 : #BAJADA
950 data_ele = data_ele[::-1] # reversa
952 data_ele = data_ele[::-1] # reversa
951 data_ele_old = data_ele_old[::-1]# reversa
953 data_ele_old = data_ele_old[::-1]# reversa
952 data_weather = data_weather[::-1,:]# reversa
954 data_weather = data_weather[::-1,:]# reversa
953 vec= numpy.where(data_ele<ang_max)
955 vec= numpy.where(data_ele<ang_max)
954 data_ele = data_ele[vec]
956 data_ele = data_ele[vec]
955 data_ele_old = data_ele_old[vec]
957 data_ele_old = data_ele_old[vec]
956 data_weather = data_weather[vec[0]]
958 data_weather = data_weather[vec[0]]
957 vec2= numpy.where(0<data_ele)
959 vec2= numpy.where(0<data_ele)
958 data_ele = data_ele[vec2]
960 data_ele = data_ele[vec2]
959 data_ele_old = data_ele_old[vec2]
961 data_ele_old = data_ele_old[vec2]
960 data_weather = data_weather[vec2[0]]
962 data_weather = data_weather[vec2[0]]
961
963
962
964
963 new_i_ele = int(round(data_ele[0]))
965 new_i_ele = int(round(data_ele[0]))
964 new_f_ele = int(round(data_ele[-1]))
966 new_f_ele = int(round(data_ele[-1]))
965 #print(data_ele)
967 #print(data_ele)
966 #print(ang_max)
968 #print(ang_max)
967 #print(data_ele_old)
969 #print(data_ele_old)
968 if new_i_ele <= 1:
970 if new_i_ele <= 1:
969 new_i_ele = 1
971 new_i_ele = 1
970 if round(data_ele[-1])>=ang_max-1:
972 if round(data_ele[-1])>=ang_max-1:
971 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
973 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
972 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
974 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
973 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
975 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
974 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
976 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
975 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
977 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
976 data_ele = self.res_ele
978 data_ele = self.res_ele
977 data_weather = self.res_weather[val_ch]
979 data_weather = self.res_weather[val_ch]
978
980
979 elif tipo_case==2: #bajada
981 elif tipo_case==2: #bajada
980 vec = numpy.where(data_ele<ang_max)
982 vec = numpy.where(data_ele<ang_max)
981 data_ele = data_ele[vec]
983 data_ele = data_ele[vec]
982 data_weather= data_weather[vec[0]]
984 data_weather= data_weather[vec[0]]
983
985
984 len_vec = len(vec)
986 len_vec = len(vec)
985 data_ele_new = data_ele[::-1] # reversa
987 data_ele_new = data_ele[::-1] # reversa
986 data_weather = data_weather[::-1,:]
988 data_weather = data_weather[::-1,:]
987 new_i_ele = int(data_ele_new[0])
989 new_i_ele = int(data_ele_new[0])
988 new_f_ele = int(data_ele_new[-1])
990 new_f_ele = int(data_ele_new[-1])
989
991
990 n1= new_i_ele- ang_min
992 n1= new_i_ele- ang_min
991 n2= ang_max - new_f_ele-1
993 n2= ang_max - new_f_ele-1
992 if n1>0:
994 if n1>0:
993 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
995 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
994 ele1_nan= numpy.ones(n1)*numpy.nan
996 ele1_nan= numpy.ones(n1)*numpy.nan
995 data_ele = numpy.hstack((ele1,data_ele_new))
997 data_ele = numpy.hstack((ele1,data_ele_new))
996 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
998 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
997 if n2>0:
999 if n2>0:
998 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1000 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
999 ele2_nan= numpy.ones(n2)*numpy.nan
1001 ele2_nan= numpy.ones(n2)*numpy.nan
1000 data_ele = numpy.hstack((data_ele,ele2))
1002 data_ele = numpy.hstack((data_ele,ele2))
1001 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1003 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1002
1004
1003 self.data_ele_tmp[val_ch] = data_ele_old
1005 self.data_ele_tmp[val_ch] = data_ele_old
1004 self.res_ele = data_ele
1006 self.res_ele = data_ele
1005 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1007 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1006 data_ele = self.res_ele
1008 data_ele = self.res_ele
1007 data_weather = self.res_weather[val_ch]
1009 data_weather = self.res_weather[val_ch]
1008
1010
1009 elif tipo_case==3:#subida
1011 elif tipo_case==3:#subida
1010 vec = numpy.where(0<data_ele)
1012 vec = numpy.where(0<data_ele)
1011 data_ele= data_ele[vec]
1013 data_ele= data_ele[vec]
1012 data_ele_new = data_ele
1014 data_ele_new = data_ele
1013 data_ele_old= data_ele_old[vec]
1015 data_ele_old= data_ele_old[vec]
1014 data_weather= data_weather[vec[0]]
1016 data_weather= data_weather[vec[0]]
1015 pos_ini = numpy.argmin(data_ele)
1017 pos_ini = numpy.argmin(data_ele)
1016 if pos_ini>0:
1018 if pos_ini>0:
1017 len_vec= len(data_ele)
1019 len_vec= len(data_ele)
1018 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
1020 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
1019 #print(vec3)
1021 #print(vec3)
1020 data_ele= data_ele[vec3]
1022 data_ele= data_ele[vec3]
1021 data_ele_new = data_ele
1023 data_ele_new = data_ele
1022 data_ele_old= data_ele_old[vec3]
1024 data_ele_old= data_ele_old[vec3]
1023 data_weather= data_weather[vec3]
1025 data_weather= data_weather[vec3]
1024
1026
1025 new_i_ele = int(data_ele_new[0])
1027 new_i_ele = int(data_ele_new[0])
1026 new_f_ele = int(data_ele_new[-1])
1028 new_f_ele = int(data_ele_new[-1])
1027 n1= new_i_ele- ang_min
1029 n1= new_i_ele- ang_min
1028 n2= ang_max - new_f_ele-1
1030 n2= ang_max - new_f_ele-1
1029 if n1>0:
1031 if n1>0:
1030 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1032 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1031 ele1_nan= numpy.ones(n1)*numpy.nan
1033 ele1_nan= numpy.ones(n1)*numpy.nan
1032 data_ele = numpy.hstack((ele1,data_ele_new))
1034 data_ele = numpy.hstack((ele1,data_ele_new))
1033 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1035 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1034 if n2>0:
1036 if n2>0:
1035 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1037 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1036 ele2_nan= numpy.ones(n2)*numpy.nan
1038 ele2_nan= numpy.ones(n2)*numpy.nan
1037 data_ele = numpy.hstack((data_ele,ele2))
1039 data_ele = numpy.hstack((data_ele,ele2))
1038 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1040 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1039
1041
1040 self.data_ele_tmp[val_ch] = data_ele_old
1042 self.data_ele_tmp[val_ch] = data_ele_old
1041 self.res_ele = data_ele
1043 self.res_ele = data_ele
1042 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1044 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1043 data_ele = self.res_ele
1045 data_ele = self.res_ele
1044 data_weather = self.res_weather[val_ch]
1046 data_weather = self.res_weather[val_ch]
1045 #print("self.data_ele_tmp",self.data_ele_tmp)
1047 #print("self.data_ele_tmp",self.data_ele_tmp)
1046 return data_weather,data_ele
1048 return data_weather,data_ele
1047
1049
1048
1050
1049 def plot(self):
1051 def plot(self):
1050 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1052 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1051 data = self.data[-1]
1053 data = self.data[-1]
1052 r = self.data.yrange
1054 r = self.data.yrange
1053 delta_height = r[1]-r[0]
1055 delta_height = r[1]-r[0]
1054 r_mask = numpy.where(r>=0)[0]
1056 r_mask = numpy.where(r>=0)[0]
1055 ##print("delta_height",delta_height)
1057 ##print("delta_height",delta_height)
1056 #print("r_mask",r_mask,len(r_mask))
1058 #print("r_mask",r_mask,len(r_mask))
1057 r = numpy.arange(len(r_mask))*delta_height
1059 r = numpy.arange(len(r_mask))*delta_height
1058 self.y = 2*r
1060 self.y = 2*r
1059 res = 1
1061 res = 1
1060 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1062 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1061 ang_max = self.ang_max
1063 ang_max = self.ang_max
1062 ang_min = self.ang_min
1064 ang_min = self.ang_min
1063 var_ang =ang_max - ang_min
1065 var_ang =ang_max - ang_min
1064 step = (int(var_ang)/(res*data['weather'].shape[0]))
1066 step = (int(var_ang)/(res*data['weather'].shape[0]))
1065 ###print("step",step)
1067 ###print("step",step)
1066 #--------------------------------------------------------
1068 #--------------------------------------------------------
1067 ##print('weather',data['weather'].shape)
1069 ##print('weather',data['weather'].shape)
1068 ##print('ele',data['ele'].shape)
1070 ##print('ele',data['ele'].shape)
1069
1071
1070 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1072 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1071 ###self.res_azi = numpy.mean(data['azi'])
1073 ###self.res_azi = numpy.mean(data['azi'])
1072 ###print("self.res_ele",self.res_ele)
1074 ###print("self.res_ele",self.res_ele)
1073 plt.clf()
1075 plt.clf()
1074 subplots = [121, 122]
1076 subplots = [121, 122]
1077 cg={'angular_spacing': 20.}
1075 if self.ini==0:
1078 if self.ini==0:
1076 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1079 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1077 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1080 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1078 print("SHAPE",self.data_ele_tmp.shape)
1081 print("SHAPE",self.data_ele_tmp.shape)
1079
1082
1080 for i,ax in enumerate(self.axes):
1083 for i,ax in enumerate(self.axes):
1081 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1084 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1082 self.res_azi = numpy.mean(data['azi'])
1085 self.res_azi = numpy.mean(data['azi'])
1083 if i==0:
1086 if i==0:
1084 print("*****************************************************************************to plot**************************",self.res_weather[i].shape)
1087 print("*****************************************************************************to plot**************************",self.res_weather[i].shape)
1088 self.zmin = self.zmin if self.zmin else 20
1089 self.zmax = self.zmax if self.zmax else 80
1085 if ax.firsttime:
1090 if ax.firsttime:
1086 #plt.clf()
1091 #plt.clf()
1087 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1092 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj=cg,vmin=self.zmin, vmax=self.zmax)
1088 #fig=self.figures[0]
1093 #fig=self.figures[0]
1089 else:
1094 else:
1090 #plt.clf()
1095 #plt.clf()
1091 if i==0:
1096 if i==0:
1092 print(self.res_weather[i])
1097 print(self.res_weather[i])
1093 print(self.res_ele)
1098 print(self.res_ele)
1094 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1099 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj=cg,vmin=self.zmin, vmax=self.zmax)
1095 caax = cgax.parasites[0]
1100 caax = cgax.parasites[0]
1096 paax = cgax.parasites[1]
1101 paax = cgax.parasites[1]
1097 cbar = plt.gcf().colorbar(pm, pad=0.075)
1102 cbar = plt.gcf().colorbar(pm, pad=0.075)
1098 caax.set_xlabel('x_range [km]')
1103 caax.set_xlabel('x_range [km]')
1099 caax.set_ylabel('y_range [km]')
1104 caax.set_ylabel('y_range [km]')
1100 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1105 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1101 print("***************************self.ini****************************",self.ini)
1106 print("***************************self.ini****************************",self.ini)
1102 self.ini= self.ini+1
1107 self.ini= self.ini+1
1103
1108
1104 class WeatherRHI_vRF2_Plot(Plot):
1109 class WeatherRHI_vRF2_Plot(Plot):
1105 CODE = 'weather'
1110 CODE = 'weather'
1106 plot_name = 'weather'
1111 plot_name = 'weather'
1107 plot_type = 'rhistyle'
1112 plot_type = 'rhistyle'
1108 buffering = False
1113 buffering = False
1109 data_ele_tmp = None
1114 data_ele_tmp = None
1110
1115
1111 def setup(self):
1116 def setup(self):
1112 print("********************")
1117 print("********************")
1113 print("********************")
1118 print("********************")
1114 print("********************")
1119 print("********************")
1115 print("SETUP WEATHER PLOT")
1120 print("SETUP WEATHER PLOT")
1116 self.ncols = 1
1121 self.ncols = 1
1117 self.nrows = 1
1122 self.nrows = 1
1118 self.nplots= 1
1123 self.nplots= 1
1119 self.ylabel= 'Range [Km]'
1124 self.ylabel= 'Range [Km]'
1120 self.titles= ['Weather']
1125 self.titles= ['Weather']
1121 if self.channels is not None:
1126 if self.channels is not None:
1122 self.nplots = len(self.channels)
1127 self.nplots = len(self.channels)
1123 self.nrows = len(self.channels)
1128 self.nrows = len(self.channels)
1124 else:
1129 else:
1125 self.nplots = self.data.shape(self.CODE)[0]
1130 self.nplots = self.data.shape(self.CODE)[0]
1126 self.nrows = self.nplots
1131 self.nrows = self.nplots
1127 self.channels = list(range(self.nplots))
1132 self.channels = list(range(self.nplots))
1128 print("channels",self.channels)
1133 print("channels",self.channels)
1129 print("que saldra", self.data.shape(self.CODE)[0])
1134 print("que saldra", self.data.shape(self.CODE)[0])
1130 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
1135 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
1131 print("self.titles",self.titles)
1136 print("self.titles",self.titles)
1132 self.colorbar=False
1137 self.colorbar=False
1133 self.width =8
1138 self.width =8
1134 self.height =8
1139 self.height =8
1135 self.ini =0
1140 self.ini =0
1136 self.len_azi =0
1141 self.len_azi =0
1137 self.buffer_ini = None
1142 self.buffer_ini = None
1138 self.buffer_ele = None
1143 self.buffer_ele = None
1139 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1144 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1140 self.flag =0
1145 self.flag =0
1141 self.indicador= 0
1146 self.indicador= 0
1142 self.last_data_ele = None
1147 self.last_data_ele = None
1143 self.val_mean = None
1148 self.val_mean = None
1144
1149
1145 def update(self, dataOut):
1150 def update(self, dataOut):
1146
1151
1147 data = {}
1152 data = {}
1148 meta = {}
1153 meta = {}
1149 if hasattr(dataOut, 'dataPP_POWER'):
1154 if hasattr(dataOut, 'dataPP_POWER'):
1150 factor = 1
1155 factor = 1
1151 if hasattr(dataOut, 'nFFTPoints'):
1156 if hasattr(dataOut, 'nFFTPoints'):
1152 factor = dataOut.normFactor
1157 factor = dataOut.normFactor
1153 print("dataOut",dataOut.data_360.shape)
1158 print("dataOut",dataOut.data_360.shape)
1154 #
1159 #
1155 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
1160 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
1156 #
1161 #
1157 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
1162 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
1158 data['azi'] = dataOut.data_azi
1163 data['azi'] = dataOut.data_azi
1159 data['ele'] = dataOut.data_ele
1164 data['ele'] = dataOut.data_ele
1160 data['case_flag'] = dataOut.case_flag
1165 data['case_flag'] = dataOut.case_flag
1161 #print("UPDATE")
1166 #print("UPDATE")
1162 #print("data[weather]",data['weather'].shape)
1167 #print("data[weather]",data['weather'].shape)
1163 #print("data[azi]",data['azi'])
1168 #print("data[azi]",data['azi'])
1164 return data, meta
1169 return data, meta
1165
1170
1166 def get2List(self,angulos):
1171 def get2List(self,angulos):
1167 list1=[]
1172 list1=[]
1168 list2=[]
1173 list2=[]
1169 for i in reversed(range(len(angulos))):
1174 for i in reversed(range(len(angulos))):
1170 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
1175 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
1171 diff_ = angulos[i]-angulos[i-1]
1176 diff_ = angulos[i]-angulos[i-1]
1172 if abs(diff_) >1.5:
1177 if abs(diff_) >1.5:
1173 list1.append(i-1)
1178 list1.append(i-1)
1174 list2.append(diff_)
1179 list2.append(diff_)
1175 return list(reversed(list1)),list(reversed(list2))
1180 return list(reversed(list1)),list(reversed(list2))
1176
1181
1177 def fixData90(self,list_,ang_):
1182 def fixData90(self,list_,ang_):
1178 if list_[0]==-1:
1183 if list_[0]==-1:
1179 vec = numpy.where(ang_<ang_[0])
1184 vec = numpy.where(ang_<ang_[0])
1180 ang_[vec] = ang_[vec]+90
1185 ang_[vec] = ang_[vec]+90
1181 return ang_
1186 return ang_
1182 return ang_
1187 return ang_
1183
1188
1184 def fixData90HL(self,angulos):
1189 def fixData90HL(self,angulos):
1185 vec = numpy.where(angulos>=90)
1190 vec = numpy.where(angulos>=90)
1186 angulos[vec]=angulos[vec]-90
1191 angulos[vec]=angulos[vec]-90
1187 return angulos
1192 return angulos
1188
1193
1189
1194
1190 def search_pos(self,pos,list_):
1195 def search_pos(self,pos,list_):
1191 for i in range(len(list_)):
1196 for i in range(len(list_)):
1192 if pos == list_[i]:
1197 if pos == list_[i]:
1193 return True,i
1198 return True,i
1194 i=None
1199 i=None
1195 return False,i
1200 return False,i
1196
1201
1197 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
1202 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
1198 size = len(ang_)
1203 size = len(ang_)
1199 size2 = 0
1204 size2 = 0
1200 for i in range(len(list2_)):
1205 for i in range(len(list2_)):
1201 size2=size2+round(abs(list2_[i]))-1
1206 size2=size2+round(abs(list2_[i]))-1
1202 new_size= size+size2
1207 new_size= size+size2
1203 ang_new = numpy.zeros(new_size)
1208 ang_new = numpy.zeros(new_size)
1204 ang_new2 = numpy.zeros(new_size)
1209 ang_new2 = numpy.zeros(new_size)
1205
1210
1206 tmp = 0
1211 tmp = 0
1207 c = 0
1212 c = 0
1208 for i in range(len(ang_)):
1213 for i in range(len(ang_)):
1209 ang_new[tmp +c] = ang_[i]
1214 ang_new[tmp +c] = ang_[i]
1210 ang_new2[tmp+c] = ang_[i]
1215 ang_new2[tmp+c] = ang_[i]
1211 condition , value = self.search_pos(i,list1_)
1216 condition , value = self.search_pos(i,list1_)
1212 if condition:
1217 if condition:
1213 pos = tmp + c + 1
1218 pos = tmp + c + 1
1214 for k in range(round(abs(list2_[value]))-1):
1219 for k in range(round(abs(list2_[value]))-1):
1215 if tipo_case==0 or tipo_case==3:#subida
1220 if tipo_case==0 or tipo_case==3:#subida
1216 ang_new[pos+k] = ang_new[pos+k-1]+1
1221 ang_new[pos+k] = ang_new[pos+k-1]+1
1217 ang_new2[pos+k] = numpy.nan
1222 ang_new2[pos+k] = numpy.nan
1218 elif tipo_case==1 or tipo_case==2:#bajada
1223 elif tipo_case==1 or tipo_case==2:#bajada
1219 ang_new[pos+k] = ang_new[pos+k-1]-1
1224 ang_new[pos+k] = ang_new[pos+k-1]-1
1220 ang_new2[pos+k] = numpy.nan
1225 ang_new2[pos+k] = numpy.nan
1221
1226
1222 tmp = pos +k
1227 tmp = pos +k
1223 c = 0
1228 c = 0
1224 c=c+1
1229 c=c+1
1225 return ang_new,ang_new2
1230 return ang_new,ang_new2
1226
1231
1227 def globalCheckPED(self,angulos,tipo_case):
1232 def globalCheckPED(self,angulos,tipo_case):
1228 l1,l2 = self.get2List(angulos)
1233 l1,l2 = self.get2List(angulos)
1229 ##print("l1",l1)
1234 ##print("l1",l1)
1230 ##print("l2",l2)
1235 ##print("l2",l2)
1231 if len(l1)>0:
1236 if len(l1)>0:
1232 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
1237 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
1233 #l1,l2 = self.get2List(angulos2)
1238 #l1,l2 = self.get2List(angulos2)
1234 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
1239 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
1235 #ang1_ = self.fixData90HL(ang1_)
1240 #ang1_ = self.fixData90HL(ang1_)
1236 #ang2_ = self.fixData90HL(ang2_)
1241 #ang2_ = self.fixData90HL(ang2_)
1237 else:
1242 else:
1238 ang1_= angulos
1243 ang1_= angulos
1239 ang2_= angulos
1244 ang2_= angulos
1240 return ang1_,ang2_
1245 return ang1_,ang2_
1241
1246
1242
1247
1243 def replaceNAN(self,data_weather,data_ele,val):
1248 def replaceNAN(self,data_weather,data_ele,val):
1244 data= data_ele
1249 data= data_ele
1245 data_T= data_weather
1250 data_T= data_weather
1246 if data.shape[0]> data_T.shape[0]:
1251 if data.shape[0]> data_T.shape[0]:
1247 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
1252 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
1248 c = 0
1253 c = 0
1249 for i in range(len(data)):
1254 for i in range(len(data)):
1250 if numpy.isnan(data[i]):
1255 if numpy.isnan(data[i]):
1251 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1256 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1252 else:
1257 else:
1253 data_N[i,:]=data_T[c,:]
1258 data_N[i,:]=data_T[c,:]
1254 c=c+1
1259 c=c+1
1255 return data_N
1260 return data_N
1256 else:
1261 else:
1257 for i in range(len(data)):
1262 for i in range(len(data)):
1258 if numpy.isnan(data[i]):
1263 if numpy.isnan(data[i]):
1259 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1264 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1260 return data_T
1265 return data_T
1261
1266
1262 def check_case(self,data_ele,ang_max,ang_min):
1267 def check_case(self,data_ele,ang_max,ang_min):
1263 start = data_ele[0]
1268 start = data_ele[0]
1264 end = data_ele[-1]
1269 end = data_ele[-1]
1265 number = (end-start)
1270 number = (end-start)
1266 len_ang=len(data_ele)
1271 len_ang=len(data_ele)
1267 print("start",start)
1272 print("start",start)
1268 print("end",end)
1273 print("end",end)
1269 print("number",number)
1274 print("number",number)
1270
1275
1271 print("len_ang",len_ang)
1276 print("len_ang",len_ang)
1272
1277
1273 #exit(1)
1278 #exit(1)
1274
1279
1275 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
1280 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
1276 return 0
1281 return 0
1277 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
1282 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
1278 # return 1
1283 # return 1
1279 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
1284 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
1280 return 1
1285 return 1
1281 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
1286 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
1282 return 2
1287 return 2
1283 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
1288 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
1284 return 3
1289 return 3
1285
1290
1286
1291
1287 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min,case_flag):
1292 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min,case_flag):
1288 ang_max= ang_max
1293 ang_max= ang_max
1289 ang_min= ang_min
1294 ang_min= ang_min
1290 data_weather=data_weather
1295 data_weather=data_weather
1291 val_ch=val_ch
1296 val_ch=val_ch
1292 ##print("*********************DATA WEATHER**************************************")
1297 ##print("*********************DATA WEATHER**************************************")
1293 ##print(data_weather)
1298 ##print(data_weather)
1294 if self.ini==0:
1299 if self.ini==0:
1295 '''
1300 '''
1296 print("**********************************************")
1301 print("**********************************************")
1297 print("**********************************************")
1302 print("**********************************************")
1298 print("***************ini**************")
1303 print("***************ini**************")
1299 print("**********************************************")
1304 print("**********************************************")
1300 print("**********************************************")
1305 print("**********************************************")
1301 '''
1306 '''
1302 #print("data_ele",data_ele)
1307 #print("data_ele",data_ele)
1303 #----------------------------------------------------------
1308 #----------------------------------------------------------
1304 tipo_case = case_flag[-1]
1309 tipo_case = case_flag[-1]
1305 #tipo_case = self.check_case(data_ele,ang_max,ang_min)
1310 #tipo_case = self.check_case(data_ele,ang_max,ang_min)
1306 print("check_case",tipo_case)
1311 print("check_case",tipo_case)
1307 #exit(1)
1312 #exit(1)
1308 #--------------------- new -------------------------
1313 #--------------------- new -------------------------
1309 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
1314 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
1310
1315
1311 #-------------------------CAMBIOS RHI---------------------------------
1316 #-------------------------CAMBIOS RHI---------------------------------
1312 start= ang_min
1317 start= ang_min
1313 end = ang_max
1318 end = ang_max
1314 n= (ang_max-ang_min)/res
1319 n= (ang_max-ang_min)/res
1315 #------ new
1320 #------ new
1316 self.start_data_ele = data_ele_new[0]
1321 self.start_data_ele = data_ele_new[0]
1317 self.end_data_ele = data_ele_new[-1]
1322 self.end_data_ele = data_ele_new[-1]
1318 if tipo_case==0 or tipo_case==3: # SUBIDA
1323 if tipo_case==0 or tipo_case==3: # SUBIDA
1319 n1= round(self.start_data_ele)- start
1324 n1= round(self.start_data_ele)- start
1320 n2= end - round(self.end_data_ele)
1325 n2= end - round(self.end_data_ele)
1321 print(self.start_data_ele)
1326 print(self.start_data_ele)
1322 print(self.end_data_ele)
1327 print(self.end_data_ele)
1323 if n1>0:
1328 if n1>0:
1324 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
1329 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
1325 ele1_nan= numpy.ones(n1)*numpy.nan
1330 ele1_nan= numpy.ones(n1)*numpy.nan
1326 data_ele = numpy.hstack((ele1,data_ele_new))
1331 data_ele = numpy.hstack((ele1,data_ele_new))
1327 print("ele1_nan",ele1_nan.shape)
1332 print("ele1_nan",ele1_nan.shape)
1328 print("data_ele_old",data_ele_old.shape)
1333 print("data_ele_old",data_ele_old.shape)
1329 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
1334 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
1330 if n2>0:
1335 if n2>0:
1331 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
1336 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
1332 ele2_nan= numpy.ones(n2)*numpy.nan
1337 ele2_nan= numpy.ones(n2)*numpy.nan
1333 data_ele = numpy.hstack((data_ele,ele2))
1338 data_ele = numpy.hstack((data_ele,ele2))
1334 print("ele2_nan",ele2_nan.shape)
1339 print("ele2_nan",ele2_nan.shape)
1335 print("data_ele_old",data_ele_old.shape)
1340 print("data_ele_old",data_ele_old.shape)
1336 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1341 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1337
1342
1338 if tipo_case==1 or tipo_case==2: # BAJADA
1343 if tipo_case==1 or tipo_case==2: # BAJADA
1339 data_ele_new = data_ele_new[::-1] # reversa
1344 data_ele_new = data_ele_new[::-1] # reversa
1340 data_ele_old = data_ele_old[::-1]# reversa
1345 data_ele_old = data_ele_old[::-1]# reversa
1341 data_weather = data_weather[::-1,:]# reversa
1346 data_weather = data_weather[::-1,:]# reversa
1342 vec= numpy.where(data_ele_new<ang_max)
1347 vec= numpy.where(data_ele_new<ang_max)
1343 data_ele_new = data_ele_new[vec]
1348 data_ele_new = data_ele_new[vec]
1344 data_ele_old = data_ele_old[vec]
1349 data_ele_old = data_ele_old[vec]
1345 data_weather = data_weather[vec[0]]
1350 data_weather = data_weather[vec[0]]
1346 vec2= numpy.where(0<data_ele_new)
1351 vec2= numpy.where(0<data_ele_new)
1347 data_ele_new = data_ele_new[vec2]
1352 data_ele_new = data_ele_new[vec2]
1348 data_ele_old = data_ele_old[vec2]
1353 data_ele_old = data_ele_old[vec2]
1349 data_weather = data_weather[vec2[0]]
1354 data_weather = data_weather[vec2[0]]
1350 self.start_data_ele = data_ele_new[0]
1355 self.start_data_ele = data_ele_new[0]
1351 self.end_data_ele = data_ele_new[-1]
1356 self.end_data_ele = data_ele_new[-1]
1352
1357
1353 n1= round(self.start_data_ele)- start
1358 n1= round(self.start_data_ele)- start
1354 n2= end - round(self.end_data_ele)-1
1359 n2= end - round(self.end_data_ele)-1
1355 print(self.start_data_ele)
1360 print(self.start_data_ele)
1356 print(self.end_data_ele)
1361 print(self.end_data_ele)
1357 if n1>0:
1362 if n1>0:
1358 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
1363 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
1359 ele1_nan= numpy.ones(n1)*numpy.nan
1364 ele1_nan= numpy.ones(n1)*numpy.nan
1360 data_ele = numpy.hstack((ele1,data_ele_new))
1365 data_ele = numpy.hstack((ele1,data_ele_new))
1361 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
1366 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
1362 if n2>0:
1367 if n2>0:
1363 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
1368 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
1364 ele2_nan= numpy.ones(n2)*numpy.nan
1369 ele2_nan= numpy.ones(n2)*numpy.nan
1365 data_ele = numpy.hstack((data_ele,ele2))
1370 data_ele = numpy.hstack((data_ele,ele2))
1366 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1371 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1367 # RADAR
1372 # RADAR
1368 # NOTA data_ele y data_weather es la variable que retorna
1373 # NOTA data_ele y data_weather es la variable que retorna
1369 val_mean = numpy.mean(data_weather[:,-1])
1374 val_mean = numpy.mean(data_weather[:,-1])
1370 self.val_mean = val_mean
1375 self.val_mean = val_mean
1371 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1376 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1372 print("eleold",data_ele_old)
1377 print("eleold",data_ele_old)
1373 print(self.data_ele_tmp[val_ch])
1378 print(self.data_ele_tmp[val_ch])
1374 print(data_ele_old.shape[0])
1379 print(data_ele_old.shape[0])
1375 print(self.data_ele_tmp[val_ch].shape[0])
1380 print(self.data_ele_tmp[val_ch].shape[0])
1376 if (data_ele_old.shape[0]==91 or self.data_ele_tmp[val_ch].shape[0]==91):
1381 if (data_ele_old.shape[0]==91 or self.data_ele_tmp[val_ch].shape[0]==91):
1377 import sys
1382 import sys
1378 print("EXIT",self.ini)
1383 print("EXIT",self.ini)
1379
1384
1380 sys.exit(1)
1385 sys.exit(1)
1381 self.data_ele_tmp[val_ch]= data_ele_old
1386 self.data_ele_tmp[val_ch]= data_ele_old
1382 else:
1387 else:
1383 #print("**********************************************")
1388 #print("**********************************************")
1384 #print("****************VARIABLE**********************")
1389 #print("****************VARIABLE**********************")
1385 #-------------------------CAMBIOS RHI---------------------------------
1390 #-------------------------CAMBIOS RHI---------------------------------
1386 #---------------------------------------------------------------------
1391 #---------------------------------------------------------------------
1387 ##print("INPUT data_ele",data_ele)
1392 ##print("INPUT data_ele",data_ele)
1388 flag=0
1393 flag=0
1389 start_ele = self.res_ele[0]
1394 start_ele = self.res_ele[0]
1390 #tipo_case = self.check_case(data_ele,ang_max,ang_min)
1395 #tipo_case = self.check_case(data_ele,ang_max,ang_min)
1391 tipo_case = case_flag[-1]
1396 tipo_case = case_flag[-1]
1392 #print("TIPO DE DATA",tipo_case)
1397 #print("TIPO DE DATA",tipo_case)
1393 #-----------new------------
1398 #-----------new------------
1394 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
1399 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
1395 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1400 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1396
1401
1397 #-------------------------------NEW RHI ITERATIVO-------------------------
1402 #-------------------------------NEW RHI ITERATIVO-------------------------
1398
1403
1399 if tipo_case==0 : # SUBIDA
1404 if tipo_case==0 : # SUBIDA
1400 vec = numpy.where(data_ele<ang_max)
1405 vec = numpy.where(data_ele<ang_max)
1401 data_ele = data_ele[vec]
1406 data_ele = data_ele[vec]
1402 data_ele_old = data_ele_old[vec]
1407 data_ele_old = data_ele_old[vec]
1403 data_weather = data_weather[vec[0]]
1408 data_weather = data_weather[vec[0]]
1404
1409
1405 vec2 = numpy.where(0<data_ele)
1410 vec2 = numpy.where(0<data_ele)
1406 data_ele= data_ele[vec2]
1411 data_ele= data_ele[vec2]
1407 data_ele_old= data_ele_old[vec2]
1412 data_ele_old= data_ele_old[vec2]
1408 ##print(data_ele_new)
1413 ##print(data_ele_new)
1409 data_weather= data_weather[vec2[0]]
1414 data_weather= data_weather[vec2[0]]
1410
1415
1411 new_i_ele = int(round(data_ele[0]))
1416 new_i_ele = int(round(data_ele[0]))
1412 new_f_ele = int(round(data_ele[-1]))
1417 new_f_ele = int(round(data_ele[-1]))
1413 #print(new_i_ele)
1418 #print(new_i_ele)
1414 #print(new_f_ele)
1419 #print(new_f_ele)
1415 #print(data_ele,len(data_ele))
1420 #print(data_ele,len(data_ele))
1416 #print(data_ele_old,len(data_ele_old))
1421 #print(data_ele_old,len(data_ele_old))
1417 if new_i_ele< 2:
1422 if new_i_ele< 2:
1418 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
1423 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
1419 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
1424 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
1420 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
1425 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
1421 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
1426 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
1422 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
1427 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
1423 data_ele = self.res_ele
1428 data_ele = self.res_ele
1424 data_weather = self.res_weather[val_ch]
1429 data_weather = self.res_weather[val_ch]
1425
1430
1426 elif tipo_case==1 : #BAJADA
1431 elif tipo_case==1 : #BAJADA
1427 data_ele = data_ele[::-1] # reversa
1432 data_ele = data_ele[::-1] # reversa
1428 data_ele_old = data_ele_old[::-1]# reversa
1433 data_ele_old = data_ele_old[::-1]# reversa
1429 data_weather = data_weather[::-1,:]# reversa
1434 data_weather = data_weather[::-1,:]# reversa
1430 vec= numpy.where(data_ele<ang_max)
1435 vec= numpy.where(data_ele<ang_max)
1431 data_ele = data_ele[vec]
1436 data_ele = data_ele[vec]
1432 data_ele_old = data_ele_old[vec]
1437 data_ele_old = data_ele_old[vec]
1433 data_weather = data_weather[vec[0]]
1438 data_weather = data_weather[vec[0]]
1434 vec2= numpy.where(0<data_ele)
1439 vec2= numpy.where(0<data_ele)
1435 data_ele = data_ele[vec2]
1440 data_ele = data_ele[vec2]
1436 data_ele_old = data_ele_old[vec2]
1441 data_ele_old = data_ele_old[vec2]
1437 data_weather = data_weather[vec2[0]]
1442 data_weather = data_weather[vec2[0]]
1438
1443
1439
1444
1440 new_i_ele = int(round(data_ele[0]))
1445 new_i_ele = int(round(data_ele[0]))
1441 new_f_ele = int(round(data_ele[-1]))
1446 new_f_ele = int(round(data_ele[-1]))
1442 #print(data_ele)
1447 #print(data_ele)
1443 #print(ang_max)
1448 #print(ang_max)
1444 #print(data_ele_old)
1449 #print(data_ele_old)
1445 if new_i_ele <= 1:
1450 if new_i_ele <= 1:
1446 new_i_ele = 1
1451 new_i_ele = 1
1447 if round(data_ele[-1])>=ang_max-1:
1452 if round(data_ele[-1])>=ang_max-1:
1448 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
1453 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
1449 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
1454 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
1450 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
1455 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
1451 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
1456 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
1452 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
1457 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
1453 data_ele = self.res_ele
1458 data_ele = self.res_ele
1454 data_weather = self.res_weather[val_ch]
1459 data_weather = self.res_weather[val_ch]
1455
1460
1456 elif tipo_case==2: #bajada
1461 elif tipo_case==2: #bajada
1457 vec = numpy.where(data_ele<ang_max)
1462 vec = numpy.where(data_ele<ang_max)
1458 data_ele = data_ele[vec]
1463 data_ele = data_ele[vec]
1459 data_weather= data_weather[vec[0]]
1464 data_weather= data_weather[vec[0]]
1460
1465
1461 len_vec = len(vec)
1466 len_vec = len(vec)
1462 data_ele_new = data_ele[::-1] # reversa
1467 data_ele_new = data_ele[::-1] # reversa
1463 data_weather = data_weather[::-1,:]
1468 data_weather = data_weather[::-1,:]
1464 new_i_ele = int(data_ele_new[0])
1469 new_i_ele = int(data_ele_new[0])
1465 new_f_ele = int(data_ele_new[-1])
1470 new_f_ele = int(data_ele_new[-1])
1466
1471
1467 n1= new_i_ele- ang_min
1472 n1= new_i_ele- ang_min
1468 n2= ang_max - new_f_ele-1
1473 n2= ang_max - new_f_ele-1
1469 if n1>0:
1474 if n1>0:
1470 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1475 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1471 ele1_nan= numpy.ones(n1)*numpy.nan
1476 ele1_nan= numpy.ones(n1)*numpy.nan
1472 data_ele = numpy.hstack((ele1,data_ele_new))
1477 data_ele = numpy.hstack((ele1,data_ele_new))
1473 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1478 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1474 if n2>0:
1479 if n2>0:
1475 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1480 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1476 ele2_nan= numpy.ones(n2)*numpy.nan
1481 ele2_nan= numpy.ones(n2)*numpy.nan
1477 data_ele = numpy.hstack((data_ele,ele2))
1482 data_ele = numpy.hstack((data_ele,ele2))
1478 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1483 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1479
1484
1480 self.data_ele_tmp[val_ch] = data_ele_old
1485 self.data_ele_tmp[val_ch] = data_ele_old
1481 self.res_ele = data_ele
1486 self.res_ele = data_ele
1482 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1487 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1483 data_ele = self.res_ele
1488 data_ele = self.res_ele
1484 data_weather = self.res_weather[val_ch]
1489 data_weather = self.res_weather[val_ch]
1485
1490
1486 elif tipo_case==3:#subida
1491 elif tipo_case==3:#subida
1487 vec = numpy.where(0<data_ele)
1492 vec = numpy.where(0<data_ele)
1488 data_ele= data_ele[vec]
1493 data_ele= data_ele[vec]
1489 data_ele_new = data_ele
1494 data_ele_new = data_ele
1490 data_ele_old= data_ele_old[vec]
1495 data_ele_old= data_ele_old[vec]
1491 data_weather= data_weather[vec[0]]
1496 data_weather= data_weather[vec[0]]
1492 pos_ini = numpy.argmin(data_ele)
1497 pos_ini = numpy.argmin(data_ele)
1493 if pos_ini>0:
1498 if pos_ini>0:
1494 len_vec= len(data_ele)
1499 len_vec= len(data_ele)
1495 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
1500 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
1496 #print(vec3)
1501 #print(vec3)
1497 data_ele= data_ele[vec3]
1502 data_ele= data_ele[vec3]
1498 data_ele_new = data_ele
1503 data_ele_new = data_ele
1499 data_ele_old= data_ele_old[vec3]
1504 data_ele_old= data_ele_old[vec3]
1500 data_weather= data_weather[vec3]
1505 data_weather= data_weather[vec3]
1501
1506
1502 new_i_ele = int(data_ele_new[0])
1507 new_i_ele = int(data_ele_new[0])
1503 new_f_ele = int(data_ele_new[-1])
1508 new_f_ele = int(data_ele_new[-1])
1504 n1= new_i_ele- ang_min
1509 n1= new_i_ele- ang_min
1505 n2= ang_max - new_f_ele-1
1510 n2= ang_max - new_f_ele-1
1506 if n1>0:
1511 if n1>0:
1507 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1512 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1508 ele1_nan= numpy.ones(n1)*numpy.nan
1513 ele1_nan= numpy.ones(n1)*numpy.nan
1509 data_ele = numpy.hstack((ele1,data_ele_new))
1514 data_ele = numpy.hstack((ele1,data_ele_new))
1510 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1515 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1511 if n2>0:
1516 if n2>0:
1512 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1517 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1513 ele2_nan= numpy.ones(n2)*numpy.nan
1518 ele2_nan= numpy.ones(n2)*numpy.nan
1514 data_ele = numpy.hstack((data_ele,ele2))
1519 data_ele = numpy.hstack((data_ele,ele2))
1515 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1520 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1516
1521
1517 self.data_ele_tmp[val_ch] = data_ele_old
1522 self.data_ele_tmp[val_ch] = data_ele_old
1518 self.res_ele = data_ele
1523 self.res_ele = data_ele
1519 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1524 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1520 data_ele = self.res_ele
1525 data_ele = self.res_ele
1521 data_weather = self.res_weather[val_ch]
1526 data_weather = self.res_weather[val_ch]
1522 #print("self.data_ele_tmp",self.data_ele_tmp)
1527 #print("self.data_ele_tmp",self.data_ele_tmp)
1523 return data_weather,data_ele
1528 return data_weather,data_ele
1524
1529
1525
1530
1526 def plot(self):
1531 def plot(self):
1527 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1532 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1528 data = self.data[-1]
1533 data = self.data[-1]
1529 r = self.data.yrange
1534 r = self.data.yrange
1530 delta_height = r[1]-r[0]
1535 delta_height = r[1]-r[0]
1531 r_mask = numpy.where(r>=0)[0]
1536 r_mask = numpy.where(r>=0)[0]
1532 ##print("delta_height",delta_height)
1537 ##print("delta_height",delta_height)
1533 #print("r_mask",r_mask,len(r_mask))
1538 #print("r_mask",r_mask,len(r_mask))
1534 r = numpy.arange(len(r_mask))*delta_height
1539 r = numpy.arange(len(r_mask))*delta_height
1535 self.y = 2*r
1540 self.y = 2*r
1536 res = 1
1541 res = 1
1537 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1542 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1538 ang_max = self.ang_max
1543 ang_max = self.ang_max
1539 ang_min = self.ang_min
1544 ang_min = self.ang_min
1540 var_ang =ang_max - ang_min
1545 var_ang =ang_max - ang_min
1541 step = (int(var_ang)/(res*data['weather'].shape[0]))
1546 step = (int(var_ang)/(res*data['weather'].shape[0]))
1542 ###print("step",step)
1547 ###print("step",step)
1543 #--------------------------------------------------------
1548 #--------------------------------------------------------
1544 ##print('weather',data['weather'].shape)
1549 ##print('weather',data['weather'].shape)
1545 ##print('ele',data['ele'].shape)
1550 ##print('ele',data['ele'].shape)
1546
1551
1547 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1552 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1548 ###self.res_azi = numpy.mean(data['azi'])
1553 ###self.res_azi = numpy.mean(data['azi'])
1549 ###print("self.res_ele",self.res_ele)
1554 ###print("self.res_ele",self.res_ele)
1550 plt.clf()
1555 plt.clf()
1551 subplots = [121, 122]
1556 subplots = [121, 122]
1552 try:
1557 try:
1553 if self.data[-2]['ele'].max()<data['ele'].max():
1558 if self.data[-2]['ele'].max()<data['ele'].max():
1554 self.ini=0
1559 self.ini=0
1555 except:
1560 except:
1556 pass
1561 pass
1557 if self.ini==0:
1562 if self.ini==0:
1558 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1563 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1559 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1564 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1560 print("SHAPE",self.data_ele_tmp.shape)
1565 print("SHAPE",self.data_ele_tmp.shape)
1561
1566
1562 for i,ax in enumerate(self.axes):
1567 for i,ax in enumerate(self.axes):
1563 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min,case_flag=self.data['case_flag'])
1568 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min,case_flag=self.data['case_flag'])
1564 self.res_azi = numpy.mean(data['azi'])
1569 self.res_azi = numpy.mean(data['azi'])
1565
1570
1566 if ax.firsttime:
1571 if ax.firsttime:
1567 #plt.clf()
1572 #plt.clf()
1568 print("Frist Plot")
1573 print("Frist Plot")
1569 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1574 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1570 #fig=self.figures[0]
1575 #fig=self.figures[0]
1571 else:
1576 else:
1572 #plt.clf()
1577 #plt.clf()
1573 print("ELSE PLOT")
1578 print("ELSE PLOT")
1574 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1579 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1575 caax = cgax.parasites[0]
1580 caax = cgax.parasites[0]
1576 paax = cgax.parasites[1]
1581 paax = cgax.parasites[1]
1577 cbar = plt.gcf().colorbar(pm, pad=0.075)
1582 cbar = plt.gcf().colorbar(pm, pad=0.075)
1578 caax.set_xlabel('x_range [km]')
1583 caax.set_xlabel('x_range [km]')
1579 caax.set_ylabel('y_range [km]')
1584 caax.set_ylabel('y_range [km]')
1580 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1585 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1581 print("***************************self.ini****************************",self.ini)
1586 print("***************************self.ini****************************",self.ini)
1582 self.ini= self.ini+1
1587 self.ini= self.ini+1
1583
1588
1584 class WeatherRHI_vRF_Plot(Plot):
1589 class WeatherRHI_vRF_Plot(Plot):
1585 CODE = 'weather'
1590 CODE = 'weather'
1586 plot_name = 'weather'
1591 plot_name = 'weather'
1587 plot_type = 'rhistyle'
1592 plot_type = 'rhistyle'
1588 buffering = False
1593 buffering = False
1589 data_ele_tmp = None
1594 data_ele_tmp = None
1590
1595
1591 def setup(self):
1596 def setup(self):
1592 print("********************")
1597 print("********************")
1593 print("********************")
1598 print("********************")
1594 print("********************")
1599 print("********************")
1595 print("SETUP WEATHER PLOT")
1600 print("SETUP WEATHER PLOT")
1596 self.ncols = 1
1601 self.ncols = 1
1597 self.nrows = 1
1602 self.nrows = 1
1598 self.nplots= 1
1603 self.nplots= 1
1599 self.ylabel= 'Range [Km]'
1604 self.ylabel= 'Range [Km]'
1600 self.titles= ['Weather']
1605 self.titles= ['Weather']
1601 if self.channels is not None:
1606 if self.channels is not None:
1602 self.nplots = len(self.channels)
1607 self.nplots = len(self.channels)
1603 self.nrows = len(self.channels)
1608 self.nrows = len(self.channels)
1604 else:
1609 else:
1605 self.nplots = self.data.shape(self.CODE)[0]
1610 self.nplots = self.data.shape(self.CODE)[0]
1606 self.nrows = self.nplots
1611 self.nrows = self.nplots
1607 self.channels = list(range(self.nplots))
1612 self.channels = list(range(self.nplots))
1608 print("channels",self.channels)
1613 print("channels",self.channels)
1609 print("que saldra", self.data.shape(self.CODE)[0])
1614 print("que saldra", self.data.shape(self.CODE)[0])
1610 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
1615 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
1611 print("self.titles",self.titles)
1616 print("self.titles",self.titles)
1612 self.colorbar=False
1617 self.colorbar=False
1613 self.width =8
1618 self.width =8
1614 self.height =8
1619 self.height =8
1615 self.ini =0
1620 self.ini =0
1616 self.len_azi =0
1621 self.len_azi =0
1617 self.buffer_ini = None
1622 self.buffer_ini = None
1618 self.buffer_ele = None
1623 self.buffer_ele = None
1619 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1624 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1620 self.flag =0
1625 self.flag =0
1621 self.indicador= 0
1626 self.indicador= 0
1622 self.last_data_ele = None
1627 self.last_data_ele = None
1623 self.val_mean = None
1628 self.val_mean = None
1624
1629
1625 def update(self, dataOut):
1630 def update(self, dataOut):
1626
1631
1627 data = {}
1632 data = {}
1628 meta = {}
1633 meta = {}
1629 if hasattr(dataOut, 'dataPP_POWER'):
1634 if hasattr(dataOut, 'dataPP_POWER'):
1630 factor = 1
1635 factor = 1
1631 if hasattr(dataOut, 'nFFTPoints'):
1636 if hasattr(dataOut, 'nFFTPoints'):
1632 factor = dataOut.normFactor
1637 factor = dataOut.normFactor
1633 print("dataOut",dataOut.data_360.shape)
1638 print("dataOut",dataOut.data_360.shape)
1634 #
1639 #
1635 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
1640 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
1636 #
1641 #
1637 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
1642 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
1638 data['azi'] = dataOut.data_azi
1643 data['azi'] = dataOut.data_azi
1639 data['ele'] = dataOut.data_ele
1644 data['ele'] = dataOut.data_ele
1640 data['case_flag'] = dataOut.case_flag
1645 data['case_flag'] = dataOut.case_flag
1641 #print("UPDATE")
1646 #print("UPDATE")
1642 #print("data[weather]",data['weather'].shape)
1647 #print("data[weather]",data['weather'].shape)
1643 #print("data[azi]",data['azi'])
1648 #print("data[azi]",data['azi'])
1644 return data, meta
1649 return data, meta
1645
1650
1646 def get2List(self,angulos):
1651 def get2List(self,angulos):
1647 list1=[]
1652 list1=[]
1648 list2=[]
1653 list2=[]
1649 #print(angulos)
1654 #print(angulos)
1650 #exit(1)
1655 #exit(1)
1651 for i in reversed(range(len(angulos))):
1656 for i in reversed(range(len(angulos))):
1652 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
1657 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
1653 diff_ = angulos[i]-angulos[i-1]
1658 diff_ = angulos[i]-angulos[i-1]
1654 if abs(diff_) >1.5:
1659 if abs(diff_) >1.5:
1655 list1.append(i-1)
1660 list1.append(i-1)
1656 list2.append(diff_)
1661 list2.append(diff_)
1657 return list(reversed(list1)),list(reversed(list2))
1662 return list(reversed(list1)),list(reversed(list2))
1658
1663
1659 def fixData90(self,list_,ang_):
1664 def fixData90(self,list_,ang_):
1660 if list_[0]==-1:
1665 if list_[0]==-1:
1661 vec = numpy.where(ang_<ang_[0])
1666 vec = numpy.where(ang_<ang_[0])
1662 ang_[vec] = ang_[vec]+90
1667 ang_[vec] = ang_[vec]+90
1663 return ang_
1668 return ang_
1664 return ang_
1669 return ang_
1665
1670
1666 def fixData90HL(self,angulos):
1671 def fixData90HL(self,angulos):
1667 vec = numpy.where(angulos>=90)
1672 vec = numpy.where(angulos>=90)
1668 angulos[vec]=angulos[vec]-90
1673 angulos[vec]=angulos[vec]-90
1669 return angulos
1674 return angulos
1670
1675
1671
1676
1672 def search_pos(self,pos,list_):
1677 def search_pos(self,pos,list_):
1673 for i in range(len(list_)):
1678 for i in range(len(list_)):
1674 if pos == list_[i]:
1679 if pos == list_[i]:
1675 return True,i
1680 return True,i
1676 i=None
1681 i=None
1677 return False,i
1682 return False,i
1678
1683
1679 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
1684 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
1680 size = len(ang_)
1685 size = len(ang_)
1681 size2 = 0
1686 size2 = 0
1682 for i in range(len(list2_)):
1687 for i in range(len(list2_)):
1683 size2=size2+round(abs(list2_[i]))-1
1688 size2=size2+round(abs(list2_[i]))-1
1684 new_size= size+size2
1689 new_size= size+size2
1685 ang_new = numpy.zeros(new_size)
1690 ang_new = numpy.zeros(new_size)
1686 ang_new2 = numpy.zeros(new_size)
1691 ang_new2 = numpy.zeros(new_size)
1687
1692
1688 tmp = 0
1693 tmp = 0
1689 c = 0
1694 c = 0
1690 for i in range(len(ang_)):
1695 for i in range(len(ang_)):
1691 ang_new[tmp +c] = ang_[i]
1696 ang_new[tmp +c] = ang_[i]
1692 ang_new2[tmp+c] = ang_[i]
1697 ang_new2[tmp+c] = ang_[i]
1693 condition , value = self.search_pos(i,list1_)
1698 condition , value = self.search_pos(i,list1_)
1694 if condition:
1699 if condition:
1695 pos = tmp + c + 1
1700 pos = tmp + c + 1
1696 for k in range(round(abs(list2_[value]))-1):
1701 for k in range(round(abs(list2_[value]))-1):
1697 if tipo_case==0 or tipo_case==3:#subida
1702 if tipo_case==0 or tipo_case==3:#subida
1698 ang_new[pos+k] = ang_new[pos+k-1]+1
1703 ang_new[pos+k] = ang_new[pos+k-1]+1
1699 ang_new2[pos+k] = numpy.nan
1704 ang_new2[pos+k] = numpy.nan
1700 elif tipo_case==1 or tipo_case==2:#bajada
1705 elif tipo_case==1 or tipo_case==2:#bajada
1701 ang_new[pos+k] = ang_new[pos+k-1]-1
1706 ang_new[pos+k] = ang_new[pos+k-1]-1
1702 ang_new2[pos+k] = numpy.nan
1707 ang_new2[pos+k] = numpy.nan
1703
1708
1704 tmp = pos +k
1709 tmp = pos +k
1705 c = 0
1710 c = 0
1706 c=c+1
1711 c=c+1
1707 return ang_new,ang_new2
1712 return ang_new,ang_new2
1708
1713
1709 def globalCheckPED(self,angulos,tipo_case):
1714 def globalCheckPED(self,angulos,tipo_case):
1710 l1,l2 = self.get2List(angulos)
1715 l1,l2 = self.get2List(angulos)
1711 print("l1",l1)
1716 print("l1",l1)
1712 print("l2",l2)
1717 print("l2",l2)
1713 if len(l1)>0:
1718 if len(l1)>0:
1714 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
1719 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
1715 #l1,l2 = self.get2List(angulos2)
1720 #l1,l2 = self.get2List(angulos2)
1716 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
1721 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
1717 #ang1_ = self.fixData90HL(ang1_)
1722 #ang1_ = self.fixData90HL(ang1_)
1718 #ang2_ = self.fixData90HL(ang2_)
1723 #ang2_ = self.fixData90HL(ang2_)
1719 else:
1724 else:
1720 ang1_= angulos
1725 ang1_= angulos
1721 ang2_= angulos
1726 ang2_= angulos
1722 return ang1_,ang2_
1727 return ang1_,ang2_
1723
1728
1724
1729
1725 def replaceNAN(self,data_weather,data_ele,val):
1730 def replaceNAN(self,data_weather,data_ele,val):
1726 data= data_ele
1731 data= data_ele
1727 data_T= data_weather
1732 data_T= data_weather
1728 #print(data.shape[0])
1733 #print(data.shape[0])
1729 #print(data_T.shape[0])
1734 #print(data_T.shape[0])
1730 #exit(1)
1735 #exit(1)
1731 if data.shape[0]> data_T.shape[0]:
1736 if data.shape[0]> data_T.shape[0]:
1732 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
1737 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
1733 c = 0
1738 c = 0
1734 for i in range(len(data)):
1739 for i in range(len(data)):
1735 if numpy.isnan(data[i]):
1740 if numpy.isnan(data[i]):
1736 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1741 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1737 else:
1742 else:
1738 data_N[i,:]=data_T[c,:]
1743 data_N[i,:]=data_T[c,:]
1739 c=c+1
1744 c=c+1
1740 return data_N
1745 return data_N
1741 else:
1746 else:
1742 for i in range(len(data)):
1747 for i in range(len(data)):
1743 if numpy.isnan(data[i]):
1748 if numpy.isnan(data[i]):
1744 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1749 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
1745 return data_T
1750 return data_T
1746
1751
1747
1752
1748 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min,case_flag):
1753 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min,case_flag):
1749 ang_max= ang_max
1754 ang_max= ang_max
1750 ang_min= ang_min
1755 ang_min= ang_min
1751 data_weather=data_weather
1756 data_weather=data_weather
1752 val_ch=val_ch
1757 val_ch=val_ch
1753 ##print("*********************DATA WEATHER**************************************")
1758 ##print("*********************DATA WEATHER**************************************")
1754 ##print(data_weather)
1759 ##print(data_weather)
1755
1760
1756 '''
1761 '''
1757 print("**********************************************")
1762 print("**********************************************")
1758 print("**********************************************")
1763 print("**********************************************")
1759 print("***************ini**************")
1764 print("***************ini**************")
1760 print("**********************************************")
1765 print("**********************************************")
1761 print("**********************************************")
1766 print("**********************************************")
1762 '''
1767 '''
1763 #print("data_ele",data_ele)
1768 #print("data_ele",data_ele)
1764 #----------------------------------------------------------
1769 #----------------------------------------------------------
1765
1770
1766 #exit(1)
1771 #exit(1)
1767 tipo_case = case_flag[-1]
1772 tipo_case = case_flag[-1]
1768 print("tipo_case",tipo_case)
1773 print("tipo_case",tipo_case)
1769 #--------------------- new -------------------------
1774 #--------------------- new -------------------------
1770 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
1775 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
1771
1776
1772 #-------------------------CAMBIOS RHI---------------------------------
1777 #-------------------------CAMBIOS RHI---------------------------------
1773
1778
1774 vec = numpy.where(data_ele<ang_max)
1779 vec = numpy.where(data_ele<ang_max)
1775 data_ele = data_ele[vec]
1780 data_ele = data_ele[vec]
1776 data_weather= data_weather[vec[0]]
1781 data_weather= data_weather[vec[0]]
1777
1782
1778 len_vec = len(vec)
1783 len_vec = len(vec)
1779 data_ele_new = data_ele[::-1] # reversa
1784 data_ele_new = data_ele[::-1] # reversa
1780 data_weather = data_weather[::-1,:]
1785 data_weather = data_weather[::-1,:]
1781 new_i_ele = int(data_ele_new[0])
1786 new_i_ele = int(data_ele_new[0])
1782 new_f_ele = int(data_ele_new[-1])
1787 new_f_ele = int(data_ele_new[-1])
1783
1788
1784 n1= new_i_ele- ang_min
1789 n1= new_i_ele- ang_min
1785 n2= ang_max - new_f_ele-1
1790 n2= ang_max - new_f_ele-1
1786 if n1>0:
1791 if n1>0:
1787 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1792 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1788 ele1_nan= numpy.ones(n1)*numpy.nan
1793 ele1_nan= numpy.ones(n1)*numpy.nan
1789 data_ele = numpy.hstack((ele1,data_ele_new))
1794 data_ele = numpy.hstack((ele1,data_ele_new))
1790 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1795 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1791 if n2>0:
1796 if n2>0:
1792 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1797 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1793 ele2_nan= numpy.ones(n2)*numpy.nan
1798 ele2_nan= numpy.ones(n2)*numpy.nan
1794 data_ele = numpy.hstack((data_ele,ele2))
1799 data_ele = numpy.hstack((data_ele,ele2))
1795 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1800 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1796
1801
1797
1802
1798 print("ele shape",data_ele.shape)
1803 print("ele shape",data_ele.shape)
1799 print(data_ele)
1804 print(data_ele)
1800
1805
1801 #print("self.data_ele_tmp",self.data_ele_tmp)
1806 #print("self.data_ele_tmp",self.data_ele_tmp)
1802 val_mean = numpy.mean(data_weather[:,-1])
1807 val_mean = numpy.mean(data_weather[:,-1])
1803 self.val_mean = val_mean
1808 self.val_mean = val_mean
1804 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1809 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1805 self.data_ele_tmp[val_ch]= data_ele_old
1810 self.data_ele_tmp[val_ch]= data_ele_old
1806
1811
1807
1812
1808 print("data_weather shape",data_weather.shape)
1813 print("data_weather shape",data_weather.shape)
1809 print(data_weather)
1814 print(data_weather)
1810 #exit(1)
1815 #exit(1)
1811 return data_weather,data_ele
1816 return data_weather,data_ele
1812
1817
1813
1818
1814 def plot(self):
1819 def plot(self):
1815 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1820 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1816 data = self.data[-1]
1821 data = self.data[-1]
1817 r = self.data.yrange
1822 r = self.data.yrange
1818 delta_height = r[1]-r[0]
1823 delta_height = r[1]-r[0]
1819 r_mask = numpy.where(r>=0)[0]
1824 r_mask = numpy.where(r>=0)[0]
1820 ##print("delta_height",delta_height)
1825 ##print("delta_height",delta_height)
1821 #print("r_mask",r_mask,len(r_mask))
1826 #print("r_mask",r_mask,len(r_mask))
1822 r = numpy.arange(len(r_mask))*delta_height
1827 r = numpy.arange(len(r_mask))*delta_height
1823 self.y = 2*r
1828 self.y = 2*r
1824 res = 1
1829 res = 1
1825 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1830 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1826 ang_max = self.ang_max
1831 ang_max = self.ang_max
1827 ang_min = self.ang_min
1832 ang_min = self.ang_min
1828 var_ang =ang_max - ang_min
1833 var_ang =ang_max - ang_min
1829 step = (int(var_ang)/(res*data['weather'].shape[0]))
1834 step = (int(var_ang)/(res*data['weather'].shape[0]))
1830 ###print("step",step)
1835 ###print("step",step)
1831 #--------------------------------------------------------
1836 #--------------------------------------------------------
1832 ##print('weather',data['weather'].shape)
1837 ##print('weather',data['weather'].shape)
1833 ##print('ele',data['ele'].shape)
1838 ##print('ele',data['ele'].shape)
1834
1839
1835 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1840 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1836 ###self.res_azi = numpy.mean(data['azi'])
1841 ###self.res_azi = numpy.mean(data['azi'])
1837 ###print("self.res_ele",self.res_ele)
1842 ###print("self.res_ele",self.res_ele)
1838 plt.clf()
1843 plt.clf()
1839 subplots = [121, 122]
1844 subplots = [121, 122]
1840 if self.ini==0:
1845 if self.ini==0:
1841 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1846 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1842 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1847 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1843 print("SHAPE",self.data_ele_tmp.shape)
1848 print("SHAPE",self.data_ele_tmp.shape)
1844
1849
1845 for i,ax in enumerate(self.axes):
1850 for i,ax in enumerate(self.axes):
1846 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min,case_flag=self.data['case_flag'])
1851 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min,case_flag=self.data['case_flag'])
1847 self.res_azi = numpy.mean(data['azi'])
1852 self.res_azi = numpy.mean(data['azi'])
1848
1853
1849 print(self.res_ele)
1854 print(self.res_ele)
1850 #exit(1)
1855 #exit(1)
1851 if ax.firsttime:
1856 if ax.firsttime:
1852 #plt.clf()
1857 #plt.clf()
1853 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1858 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1854 #fig=self.figures[0]
1859 #fig=self.figures[0]
1855 else:
1860 else:
1856
1861
1857 #plt.clf()
1862 #plt.clf()
1858 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1863 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1859 caax = cgax.parasites[0]
1864 caax = cgax.parasites[0]
1860 paax = cgax.parasites[1]
1865 paax = cgax.parasites[1]
1861 cbar = plt.gcf().colorbar(pm, pad=0.075)
1866 cbar = plt.gcf().colorbar(pm, pad=0.075)
1862 caax.set_xlabel('x_range [km]')
1867 caax.set_xlabel('x_range [km]')
1863 caax.set_ylabel('y_range [km]')
1868 caax.set_ylabel('y_range [km]')
1864 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1869 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1865 print("***************************self.ini****************************",self.ini)
1870 print("***************************self.ini****************************",self.ini)
1866 self.ini= self.ini+1
1871 self.ini= self.ini+1
1867
1872
1868 class WeatherRHI_vRF3_Plot(Plot):
1873 class WeatherRHI_vRF3_Plot(Plot):
1869 CODE = 'weather'
1874 CODE = 'weather'
1870 plot_name = 'weather'
1875 plot_name = 'weather'
1871 plot_type = 'rhistyle'
1876 plot_type = 'rhistyle'
1872 buffering = False
1877 buffering = False
1873 data_ele_tmp = None
1878 data_ele_tmp = None
1874
1879
1875 def setup(self):
1880 def setup(self):
1876 print("********************")
1881 print("********************")
1877 print("********************")
1882 print("********************")
1878 print("********************")
1883 print("********************")
1879 print("SETUP WEATHER PLOT")
1884 print("SETUP WEATHER PLOT")
1880 self.ncols = 1
1885 self.ncols = 1
1881 self.nrows = 1
1886 self.nrows = 1
1882 self.nplots= 1
1887 self.nplots= 1
1883 self.ylabel= 'Range [Km]'
1888 self.ylabel= 'Range [Km]'
1884 self.titles= ['Weather']
1889 self.titles= ['Weather']
1885 if self.channels is not None:
1890 if self.channels is not None:
1886 self.nplots = len(self.channels)
1891 self.nplots = len(self.channels)
1887 self.nrows = len(self.channels)
1892 self.nrows = len(self.channels)
1888 else:
1893 else:
1889 self.nplots = self.data.shape(self.CODE)[0]
1894 self.nplots = self.data.shape(self.CODE)[0]
1890 self.nrows = self.nplots
1895 self.nrows = self.nplots
1891 self.channels = list(range(self.nplots))
1896 self.channels = list(range(self.nplots))
1892 print("channels",self.channels)
1897 print("channels",self.channels)
1893 print("que saldra", self.data.shape(self.CODE)[0])
1898 print("que saldra", self.data.shape(self.CODE)[0])
1894 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
1899 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
1895 print("self.titles",self.titles)
1900 print("self.titles",self.titles)
1896 self.colorbar=False
1901 self.colorbar=False
1897 self.width =8
1902 self.width =8
1898 self.height =8
1903 self.height =8
1899 self.ini =0
1904 self.ini =0
1900 self.len_azi =0
1905 self.len_azi =0
1901 self.buffer_ini = None
1906 self.buffer_ini = None
1902 self.buffer_ele = None
1907 self.buffer_ele = None
1903 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1908 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
1904 self.flag =0
1909 self.flag =0
1905 self.indicador= 0
1910 self.indicador= 0
1906 self.last_data_ele = None
1911 self.last_data_ele = None
1907 self.val_mean = None
1912 self.val_mean = None
1908
1913
1909 def update(self, dataOut):
1914 def update(self, dataOut):
1910
1915
1911 data = {}
1916 data = {}
1912 meta = {}
1917 meta = {}
1913 if hasattr(dataOut, 'dataPP_POWER'):
1918 if hasattr(dataOut, 'dataPP_POWER'):
1914 factor = 1
1919 factor = 1
1915 if hasattr(dataOut, 'nFFTPoints'):
1920 if hasattr(dataOut, 'nFFTPoints'):
1916 factor = dataOut.normFactor
1921 factor = dataOut.normFactor
1917 print("dataOut",dataOut.data_360.shape)
1922 print("dataOut",dataOut.data_360.shape)
1918 #
1923 #
1919 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
1924 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
1920 #
1925 #
1921 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
1926 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
1922 data['azi'] = dataOut.data_azi
1927 data['azi'] = dataOut.data_azi
1923 data['ele'] = dataOut.data_ele
1928 data['ele'] = dataOut.data_ele
1924 #data['case_flag'] = dataOut.case_flag
1929 #data['case_flag'] = dataOut.case_flag
1925 #print("UPDATE")
1930 #print("UPDATE")
1926 #print("data[weather]",data['weather'].shape)
1931 #print("data[weather]",data['weather'].shape)
1927 #print("data[azi]",data['azi'])
1932 #print("data[azi]",data['azi'])
1928 return data, meta
1933 return data, meta
1929
1934
1930 def get2List(self,angulos):
1935 def get2List(self,angulos):
1931 list1=[]
1936 list1=[]
1932 list2=[]
1937 list2=[]
1933 for i in reversed(range(len(angulos))):
1938 for i in reversed(range(len(angulos))):
1934 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
1939 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
1935 diff_ = angulos[i]-angulos[i-1]
1940 diff_ = angulos[i]-angulos[i-1]
1936 if abs(diff_) >1.5:
1941 if abs(diff_) >1.5:
1937 list1.append(i-1)
1942 list1.append(i-1)
1938 list2.append(diff_)
1943 list2.append(diff_)
1939 return list(reversed(list1)),list(reversed(list2))
1944 return list(reversed(list1)),list(reversed(list2))
1940
1945
1941 def fixData90(self,list_,ang_):
1946 def fixData90(self,list_,ang_):
1942 if list_[0]==-1:
1947 if list_[0]==-1:
1943 vec = numpy.where(ang_<ang_[0])
1948 vec = numpy.where(ang_<ang_[0])
1944 ang_[vec] = ang_[vec]+90
1949 ang_[vec] = ang_[vec]+90
1945 return ang_
1950 return ang_
1946 return ang_
1951 return ang_
1947
1952
1948 def fixData90HL(self,angulos):
1953 def fixData90HL(self,angulos):
1949 vec = numpy.where(angulos>=90)
1954 vec = numpy.where(angulos>=90)
1950 angulos[vec]=angulos[vec]-90
1955 angulos[vec]=angulos[vec]-90
1951 return angulos
1956 return angulos
1952
1957
1953
1958
1954 def search_pos(self,pos,list_):
1959 def search_pos(self,pos,list_):
1955 for i in range(len(list_)):
1960 for i in range(len(list_)):
1956 if pos == list_[i]:
1961 if pos == list_[i]:
1957 return True,i
1962 return True,i
1958 i=None
1963 i=None
1959 return False,i
1964 return False,i
1960
1965
1961 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
1966 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
1962 size = len(ang_)
1967 size = len(ang_)
1963 size2 = 0
1968 size2 = 0
1964 for i in range(len(list2_)):
1969 for i in range(len(list2_)):
1965 size2=size2+round(abs(list2_[i]))-1
1970 size2=size2+round(abs(list2_[i]))-1
1966 new_size= size+size2
1971 new_size= size+size2
1967 ang_new = numpy.zeros(new_size)
1972 ang_new = numpy.zeros(new_size)
1968 ang_new2 = numpy.zeros(new_size)
1973 ang_new2 = numpy.zeros(new_size)
1969
1974
1970 tmp = 0
1975 tmp = 0
1971 c = 0
1976 c = 0
1972 for i in range(len(ang_)):
1977 for i in range(len(ang_)):
1973 ang_new[tmp +c] = ang_[i]
1978 ang_new[tmp +c] = ang_[i]
1974 ang_new2[tmp+c] = ang_[i]
1979 ang_new2[tmp+c] = ang_[i]
1975 condition , value = self.search_pos(i,list1_)
1980 condition , value = self.search_pos(i,list1_)
1976 if condition:
1981 if condition:
1977 pos = tmp + c + 1
1982 pos = tmp + c + 1
1978 for k in range(round(abs(list2_[value]))-1):
1983 for k in range(round(abs(list2_[value]))-1):
1979 if tipo_case==0 or tipo_case==3:#subida
1984 if tipo_case==0 or tipo_case==3:#subida
1980 ang_new[pos+k] = ang_new[pos+k-1]+1
1985 ang_new[pos+k] = ang_new[pos+k-1]+1
1981 ang_new2[pos+k] = numpy.nan
1986 ang_new2[pos+k] = numpy.nan
1982 elif tipo_case==1 or tipo_case==2:#bajada
1987 elif tipo_case==1 or tipo_case==2:#bajada
1983 ang_new[pos+k] = ang_new[pos+k-1]-1
1988 ang_new[pos+k] = ang_new[pos+k-1]-1
1984 ang_new2[pos+k] = numpy.nan
1989 ang_new2[pos+k] = numpy.nan
1985
1990
1986 tmp = pos +k
1991 tmp = pos +k
1987 c = 0
1992 c = 0
1988 c=c+1
1993 c=c+1
1989 return ang_new,ang_new2
1994 return ang_new,ang_new2
1990
1995
1991 def globalCheckPED(self,angulos,tipo_case):
1996 def globalCheckPED(self,angulos,tipo_case):
1992 l1,l2 = self.get2List(angulos)
1997 l1,l2 = self.get2List(angulos)
1993 ##print("l1",l1)
1998 ##print("l1",l1)
1994 ##print("l2",l2)
1999 ##print("l2",l2)
1995 if len(l1)>0:
2000 if len(l1)>0:
1996 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
2001 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
1997 #l1,l2 = self.get2List(angulos2)
2002 #l1,l2 = self.get2List(angulos2)
1998 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
2003 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
1999 #ang1_ = self.fixData90HL(ang1_)
2004 #ang1_ = self.fixData90HL(ang1_)
2000 #ang2_ = self.fixData90HL(ang2_)
2005 #ang2_ = self.fixData90HL(ang2_)
2001 else:
2006 else:
2002 ang1_= angulos
2007 ang1_= angulos
2003 ang2_= angulos
2008 ang2_= angulos
2004 return ang1_,ang2_
2009 return ang1_,ang2_
2005
2010
2006
2011
2007 def replaceNAN(self,data_weather,data_ele,val):
2012 def replaceNAN(self,data_weather,data_ele,val):
2008 data= data_ele
2013 data= data_ele
2009 data_T= data_weather
2014 data_T= data_weather
2010
2015
2011 if data.shape[0]> data_T.shape[0]:
2016 if data.shape[0]> data_T.shape[0]:
2012 print("IF")
2017 print("IF")
2013 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
2018 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
2014 c = 0
2019 c = 0
2015 for i in range(len(data)):
2020 for i in range(len(data)):
2016 if numpy.isnan(data[i]):
2021 if numpy.isnan(data[i]):
2017 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
2022 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
2018 else:
2023 else:
2019 data_N[i,:]=data_T[c,:]
2024 data_N[i,:]=data_T[c,:]
2020 c=c+1
2025 c=c+1
2021 return data_N
2026 return data_N
2022 else:
2027 else:
2023 print("else")
2028 print("else")
2024 for i in range(len(data)):
2029 for i in range(len(data)):
2025 if numpy.isnan(data[i]):
2030 if numpy.isnan(data[i]):
2026 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
2031 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
2027 return data_T
2032 return data_T
2028
2033
2029 def check_case(self,data_ele,ang_max,ang_min):
2034 def check_case(self,data_ele,ang_max,ang_min):
2030 start = data_ele[0]
2035 start = data_ele[0]
2031 end = data_ele[-1]
2036 end = data_ele[-1]
2032 number = (end-start)
2037 number = (end-start)
2033 len_ang=len(data_ele)
2038 len_ang=len(data_ele)
2034 print("start",start)
2039 print("start",start)
2035 print("end",end)
2040 print("end",end)
2036 print("number",number)
2041 print("number",number)
2037
2042
2038 print("len_ang",len_ang)
2043 print("len_ang",len_ang)
2039
2044
2040 #exit(1)
2045 #exit(1)
2041
2046
2042 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
2047 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
2043 return 0
2048 return 0
2044 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
2049 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
2045 # return 1
2050 # return 1
2046 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
2051 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
2047 return 1
2052 return 1
2048 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
2053 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
2049 return 2
2054 return 2
2050 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
2055 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
2051 return 3
2056 return 3
2052
2057
2053
2058
2054 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min,case_flag):
2059 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min,case_flag):
2055 ang_max= ang_max
2060 ang_max= ang_max
2056 ang_min= ang_min
2061 ang_min= ang_min
2057 data_weather=data_weather
2062 data_weather=data_weather
2058 val_ch=val_ch
2063 val_ch=val_ch
2059 ##print("*********************DATA WEATHER**************************************")
2064 ##print("*********************DATA WEATHER**************************************")
2060 ##print(data_weather)
2065 ##print(data_weather)
2061 if self.ini==0:
2066 if self.ini==0:
2062
2067
2063 #--------------------- new -------------------------
2068 #--------------------- new -------------------------
2064 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
2069 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
2065
2070
2066 #-------------------------CAMBIOS RHI---------------------------------
2071 #-------------------------CAMBIOS RHI---------------------------------
2067 start= ang_min
2072 start= ang_min
2068 end = ang_max
2073 end = ang_max
2069 n= (ang_max-ang_min)/res
2074 n= (ang_max-ang_min)/res
2070 #------ new
2075 #------ new
2071 self.start_data_ele = data_ele_new[0]
2076 self.start_data_ele = data_ele_new[0]
2072 self.end_data_ele = data_ele_new[-1]
2077 self.end_data_ele = data_ele_new[-1]
2073 if tipo_case==0 or tipo_case==3: # SUBIDA
2078 if tipo_case==0 or tipo_case==3: # SUBIDA
2074 n1= round(self.start_data_ele)- start
2079 n1= round(self.start_data_ele)- start
2075 n2= end - round(self.end_data_ele)
2080 n2= end - round(self.end_data_ele)
2076 print(self.start_data_ele)
2081 print(self.start_data_ele)
2077 print(self.end_data_ele)
2082 print(self.end_data_ele)
2078 if n1>0:
2083 if n1>0:
2079 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
2084 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
2080 ele1_nan= numpy.ones(n1)*numpy.nan
2085 ele1_nan= numpy.ones(n1)*numpy.nan
2081 data_ele = numpy.hstack((ele1,data_ele_new))
2086 data_ele = numpy.hstack((ele1,data_ele_new))
2082 print("ele1_nan",ele1_nan.shape)
2087 print("ele1_nan",ele1_nan.shape)
2083 print("data_ele_old",data_ele_old.shape)
2088 print("data_ele_old",data_ele_old.shape)
2084 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
2089 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
2085 if n2>0:
2090 if n2>0:
2086 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
2091 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
2087 ele2_nan= numpy.ones(n2)*numpy.nan
2092 ele2_nan= numpy.ones(n2)*numpy.nan
2088 data_ele = numpy.hstack((data_ele,ele2))
2093 data_ele = numpy.hstack((data_ele,ele2))
2089 print("ele2_nan",ele2_nan.shape)
2094 print("ele2_nan",ele2_nan.shape)
2090 print("data_ele_old",data_ele_old.shape)
2095 print("data_ele_old",data_ele_old.shape)
2091 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2096 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2092
2097
2093 if tipo_case==1 or tipo_case==2: # BAJADA
2098 if tipo_case==1 or tipo_case==2: # BAJADA
2094 data_ele_new = data_ele_new[::-1] # reversa
2099 data_ele_new = data_ele_new[::-1] # reversa
2095 data_ele_old = data_ele_old[::-1]# reversa
2100 data_ele_old = data_ele_old[::-1]# reversa
2096 data_weather = data_weather[::-1,:]# reversa
2101 data_weather = data_weather[::-1,:]# reversa
2097 vec= numpy.where(data_ele_new<ang_max)
2102 vec= numpy.where(data_ele_new<ang_max)
2098 data_ele_new = data_ele_new[vec]
2103 data_ele_new = data_ele_new[vec]
2099 data_ele_old = data_ele_old[vec]
2104 data_ele_old = data_ele_old[vec]
2100 data_weather = data_weather[vec[0]]
2105 data_weather = data_weather[vec[0]]
2101 vec2= numpy.where(0<data_ele_new)
2106 vec2= numpy.where(0<data_ele_new)
2102 data_ele_new = data_ele_new[vec2]
2107 data_ele_new = data_ele_new[vec2]
2103 data_ele_old = data_ele_old[vec2]
2108 data_ele_old = data_ele_old[vec2]
2104 data_weather = data_weather[vec2[0]]
2109 data_weather = data_weather[vec2[0]]
2105 self.start_data_ele = data_ele_new[0]
2110 self.start_data_ele = data_ele_new[0]
2106 self.end_data_ele = data_ele_new[-1]
2111 self.end_data_ele = data_ele_new[-1]
2107
2112
2108 n1= round(self.start_data_ele)- start
2113 n1= round(self.start_data_ele)- start
2109 n2= end - round(self.end_data_ele)-1
2114 n2= end - round(self.end_data_ele)-1
2110 print(self.start_data_ele)
2115 print(self.start_data_ele)
2111 print(self.end_data_ele)
2116 print(self.end_data_ele)
2112 if n1>0:
2117 if n1>0:
2113 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
2118 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
2114 ele1_nan= numpy.ones(n1)*numpy.nan
2119 ele1_nan= numpy.ones(n1)*numpy.nan
2115 data_ele = numpy.hstack((ele1,data_ele_new))
2120 data_ele = numpy.hstack((ele1,data_ele_new))
2116 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
2121 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
2117 if n2>0:
2122 if n2>0:
2118 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
2123 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
2119 ele2_nan= numpy.ones(n2)*numpy.nan
2124 ele2_nan= numpy.ones(n2)*numpy.nan
2120 data_ele = numpy.hstack((data_ele,ele2))
2125 data_ele = numpy.hstack((data_ele,ele2))
2121 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2126 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2122 # RADAR
2127 # RADAR
2123 # NOTA data_ele y data_weather es la variable que retorna
2128 # NOTA data_ele y data_weather es la variable que retorna
2124 val_mean = numpy.mean(data_weather[:,-1])
2129 val_mean = numpy.mean(data_weather[:,-1])
2125 self.val_mean = val_mean
2130 self.val_mean = val_mean
2126 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2131 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2127 print("eleold",data_ele_old)
2132 print("eleold",data_ele_old)
2128 print(self.data_ele_tmp[val_ch])
2133 print(self.data_ele_tmp[val_ch])
2129 print(data_ele_old.shape[0])
2134 print(data_ele_old.shape[0])
2130 print(self.data_ele_tmp[val_ch].shape[0])
2135 print(self.data_ele_tmp[val_ch].shape[0])
2131 if (data_ele_old.shape[0]==91 or self.data_ele_tmp[val_ch].shape[0]==91):
2136 if (data_ele_old.shape[0]==91 or self.data_ele_tmp[val_ch].shape[0]==91):
2132 import sys
2137 import sys
2133 print("EXIT",self.ini)
2138 print("EXIT",self.ini)
2134
2139
2135 sys.exit(1)
2140 sys.exit(1)
2136 self.data_ele_tmp[val_ch]= data_ele_old
2141 self.data_ele_tmp[val_ch]= data_ele_old
2137 else:
2142 else:
2138 #print("**********************************************")
2143 #print("**********************************************")
2139 #print("****************VARIABLE**********************")
2144 #print("****************VARIABLE**********************")
2140 #-------------------------CAMBIOS RHI---------------------------------
2145 #-------------------------CAMBIOS RHI---------------------------------
2141 #---------------------------------------------------------------------
2146 #---------------------------------------------------------------------
2142 ##print("INPUT data_ele",data_ele)
2147 ##print("INPUT data_ele",data_ele)
2143 flag=0
2148 flag=0
2144 start_ele = self.res_ele[0]
2149 start_ele = self.res_ele[0]
2145 #tipo_case = self.check_case(data_ele,ang_max,ang_min)
2150 #tipo_case = self.check_case(data_ele,ang_max,ang_min)
2146 tipo_case = case_flag[-1]
2151 tipo_case = case_flag[-1]
2147 #print("TIPO DE DATA",tipo_case)
2152 #print("TIPO DE DATA",tipo_case)
2148 #-----------new------------
2153 #-----------new------------
2149 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
2154 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
2150 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2155 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2151
2156
2152 #-------------------------------NEW RHI ITERATIVO-------------------------
2157 #-------------------------------NEW RHI ITERATIVO-------------------------
2153
2158
2154 if tipo_case==0 : # SUBIDA
2159 if tipo_case==0 : # SUBIDA
2155 vec = numpy.where(data_ele<ang_max)
2160 vec = numpy.where(data_ele<ang_max)
2156 data_ele = data_ele[vec]
2161 data_ele = data_ele[vec]
2157 data_ele_old = data_ele_old[vec]
2162 data_ele_old = data_ele_old[vec]
2158 data_weather = data_weather[vec[0]]
2163 data_weather = data_weather[vec[0]]
2159
2164
2160 vec2 = numpy.where(0<data_ele)
2165 vec2 = numpy.where(0<data_ele)
2161 data_ele= data_ele[vec2]
2166 data_ele= data_ele[vec2]
2162 data_ele_old= data_ele_old[vec2]
2167 data_ele_old= data_ele_old[vec2]
2163 ##print(data_ele_new)
2168 ##print(data_ele_new)
2164 data_weather= data_weather[vec2[0]]
2169 data_weather= data_weather[vec2[0]]
2165
2170
2166 new_i_ele = int(round(data_ele[0]))
2171 new_i_ele = int(round(data_ele[0]))
2167 new_f_ele = int(round(data_ele[-1]))
2172 new_f_ele = int(round(data_ele[-1]))
2168 #print(new_i_ele)
2173 #print(new_i_ele)
2169 #print(new_f_ele)
2174 #print(new_f_ele)
2170 #print(data_ele,len(data_ele))
2175 #print(data_ele,len(data_ele))
2171 #print(data_ele_old,len(data_ele_old))
2176 #print(data_ele_old,len(data_ele_old))
2172 if new_i_ele< 2:
2177 if new_i_ele< 2:
2173 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
2178 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
2174 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
2179 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
2175 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
2180 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
2176 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
2181 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
2177 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
2182 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
2178 data_ele = self.res_ele
2183 data_ele = self.res_ele
2179 data_weather = self.res_weather[val_ch]
2184 data_weather = self.res_weather[val_ch]
2180
2185
2181 elif tipo_case==1 : #BAJADA
2186 elif tipo_case==1 : #BAJADA
2182 data_ele = data_ele[::-1] # reversa
2187 data_ele = data_ele[::-1] # reversa
2183 data_ele_old = data_ele_old[::-1]# reversa
2188 data_ele_old = data_ele_old[::-1]# reversa
2184 data_weather = data_weather[::-1,:]# reversa
2189 data_weather = data_weather[::-1,:]# reversa
2185 vec= numpy.where(data_ele<ang_max)
2190 vec= numpy.where(data_ele<ang_max)
2186 data_ele = data_ele[vec]
2191 data_ele = data_ele[vec]
2187 data_ele_old = data_ele_old[vec]
2192 data_ele_old = data_ele_old[vec]
2188 data_weather = data_weather[vec[0]]
2193 data_weather = data_weather[vec[0]]
2189 vec2= numpy.where(0<data_ele)
2194 vec2= numpy.where(0<data_ele)
2190 data_ele = data_ele[vec2]
2195 data_ele = data_ele[vec2]
2191 data_ele_old = data_ele_old[vec2]
2196 data_ele_old = data_ele_old[vec2]
2192 data_weather = data_weather[vec2[0]]
2197 data_weather = data_weather[vec2[0]]
2193
2198
2194
2199
2195 new_i_ele = int(round(data_ele[0]))
2200 new_i_ele = int(round(data_ele[0]))
2196 new_f_ele = int(round(data_ele[-1]))
2201 new_f_ele = int(round(data_ele[-1]))
2197 #print(data_ele)
2202 #print(data_ele)
2198 #print(ang_max)
2203 #print(ang_max)
2199 #print(data_ele_old)
2204 #print(data_ele_old)
2200 if new_i_ele <= 1:
2205 if new_i_ele <= 1:
2201 new_i_ele = 1
2206 new_i_ele = 1
2202 if round(data_ele[-1])>=ang_max-1:
2207 if round(data_ele[-1])>=ang_max-1:
2203 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
2208 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
2204 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
2209 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
2205 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
2210 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
2206 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
2211 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
2207 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
2212 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
2208 data_ele = self.res_ele
2213 data_ele = self.res_ele
2209 data_weather = self.res_weather[val_ch]
2214 data_weather = self.res_weather[val_ch]
2210
2215
2211 elif tipo_case==2: #bajada
2216 elif tipo_case==2: #bajada
2212 vec = numpy.where(data_ele<ang_max)
2217 vec = numpy.where(data_ele<ang_max)
2213 data_ele = data_ele[vec]
2218 data_ele = data_ele[vec]
2214 data_weather= data_weather[vec[0]]
2219 data_weather= data_weather[vec[0]]
2215
2220
2216 len_vec = len(vec)
2221 len_vec = len(vec)
2217 data_ele_new = data_ele[::-1] # reversa
2222 data_ele_new = data_ele[::-1] # reversa
2218 data_weather = data_weather[::-1,:]
2223 data_weather = data_weather[::-1,:]
2219 new_i_ele = int(data_ele_new[0])
2224 new_i_ele = int(data_ele_new[0])
2220 new_f_ele = int(data_ele_new[-1])
2225 new_f_ele = int(data_ele_new[-1])
2221
2226
2222 n1= new_i_ele- ang_min
2227 n1= new_i_ele- ang_min
2223 n2= ang_max - new_f_ele-1
2228 n2= ang_max - new_f_ele-1
2224 if n1>0:
2229 if n1>0:
2225 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
2230 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
2226 ele1_nan= numpy.ones(n1)*numpy.nan
2231 ele1_nan= numpy.ones(n1)*numpy.nan
2227 data_ele = numpy.hstack((ele1,data_ele_new))
2232 data_ele = numpy.hstack((ele1,data_ele_new))
2228 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
2233 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
2229 if n2>0:
2234 if n2>0:
2230 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
2235 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
2231 ele2_nan= numpy.ones(n2)*numpy.nan
2236 ele2_nan= numpy.ones(n2)*numpy.nan
2232 data_ele = numpy.hstack((data_ele,ele2))
2237 data_ele = numpy.hstack((data_ele,ele2))
2233 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2238 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2234
2239
2235 self.data_ele_tmp[val_ch] = data_ele_old
2240 self.data_ele_tmp[val_ch] = data_ele_old
2236 self.res_ele = data_ele
2241 self.res_ele = data_ele
2237 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2242 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2238 data_ele = self.res_ele
2243 data_ele = self.res_ele
2239 data_weather = self.res_weather[val_ch]
2244 data_weather = self.res_weather[val_ch]
2240
2245
2241 elif tipo_case==3:#subida
2246 elif tipo_case==3:#subida
2242 vec = numpy.where(0<data_ele)
2247 vec = numpy.where(0<data_ele)
2243 data_ele= data_ele[vec]
2248 data_ele= data_ele[vec]
2244 data_ele_new = data_ele
2249 data_ele_new = data_ele
2245 data_ele_old= data_ele_old[vec]
2250 data_ele_old= data_ele_old[vec]
2246 data_weather= data_weather[vec[0]]
2251 data_weather= data_weather[vec[0]]
2247 pos_ini = numpy.argmin(data_ele)
2252 pos_ini = numpy.argmin(data_ele)
2248 if pos_ini>0:
2253 if pos_ini>0:
2249 len_vec= len(data_ele)
2254 len_vec= len(data_ele)
2250 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
2255 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
2251 #print(vec3)
2256 #print(vec3)
2252 data_ele= data_ele[vec3]
2257 data_ele= data_ele[vec3]
2253 data_ele_new = data_ele
2258 data_ele_new = data_ele
2254 data_ele_old= data_ele_old[vec3]
2259 data_ele_old= data_ele_old[vec3]
2255 data_weather= data_weather[vec3]
2260 data_weather= data_weather[vec3]
2256
2261
2257 new_i_ele = int(data_ele_new[0])
2262 new_i_ele = int(data_ele_new[0])
2258 new_f_ele = int(data_ele_new[-1])
2263 new_f_ele = int(data_ele_new[-1])
2259 n1= new_i_ele- ang_min
2264 n1= new_i_ele- ang_min
2260 n2= ang_max - new_f_ele-1
2265 n2= ang_max - new_f_ele-1
2261 if n1>0:
2266 if n1>0:
2262 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
2267 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
2263 ele1_nan= numpy.ones(n1)*numpy.nan
2268 ele1_nan= numpy.ones(n1)*numpy.nan
2264 data_ele = numpy.hstack((ele1,data_ele_new))
2269 data_ele = numpy.hstack((ele1,data_ele_new))
2265 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
2270 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
2266 if n2>0:
2271 if n2>0:
2267 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
2272 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
2268 ele2_nan= numpy.ones(n2)*numpy.nan
2273 ele2_nan= numpy.ones(n2)*numpy.nan
2269 data_ele = numpy.hstack((data_ele,ele2))
2274 data_ele = numpy.hstack((data_ele,ele2))
2270 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2275 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
2271
2276
2272 self.data_ele_tmp[val_ch] = data_ele_old
2277 self.data_ele_tmp[val_ch] = data_ele_old
2273 self.res_ele = data_ele
2278 self.res_ele = data_ele
2274 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2279 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
2275 data_ele = self.res_ele
2280 data_ele = self.res_ele
2276 data_weather = self.res_weather[val_ch]
2281 data_weather = self.res_weather[val_ch]
2277 #print("self.data_ele_tmp",self.data_ele_tmp)
2282 #print("self.data_ele_tmp",self.data_ele_tmp)
2278 return data_weather,data_ele
2283 return data_weather,data_ele
2279
2284
2280 def const_ploteo_vRF(self,val_ch,data_weather,data_ele,res,ang_max,ang_min):
2285 def const_ploteo_vRF(self,val_ch,data_weather,data_ele,res,ang_max,ang_min):
2281
2286
2282 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,1)
2287 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,1)
2283
2288
2284 data_ele = data_ele_old.copy()
2289 data_ele = data_ele_old.copy()
2285
2290
2286 diff_1 = ang_max - data_ele[0]
2291 diff_1 = ang_max - data_ele[0]
2287 angles_1_nan = numpy.linspace(ang_max,data_ele[0]+1,int(diff_1)-1)#*numpy.nan
2292 angles_1_nan = numpy.linspace(ang_max,data_ele[0]+1,int(diff_1)-1)#*numpy.nan
2288
2293
2289 diff_2 = data_ele[-1]-ang_min
2294 diff_2 = data_ele[-1]-ang_min
2290 angles_2_nan = numpy.linspace(data_ele[-1]-1,ang_min,int(diff_2)-1)#*numpy.nan
2295 angles_2_nan = numpy.linspace(data_ele[-1]-1,ang_min,int(diff_2)-1)#*numpy.nan
2291
2296
2292 angles_filled = numpy.concatenate((angles_1_nan,data_ele,angles_2_nan))
2297 angles_filled = numpy.concatenate((angles_1_nan,data_ele,angles_2_nan))
2293
2298
2294 print(angles_filled)
2299 print(angles_filled)
2295
2300
2296 data_1_nan = numpy.ones([angles_1_nan.shape[0],len(self.r_mask)])*numpy.nan
2301 data_1_nan = numpy.ones([angles_1_nan.shape[0],len(self.r_mask)])*numpy.nan
2297 data_2_nan = numpy.ones([angles_2_nan.shape[0],len(self.r_mask)])*numpy.nan
2302 data_2_nan = numpy.ones([angles_2_nan.shape[0],len(self.r_mask)])*numpy.nan
2298
2303
2299 data_filled = numpy.concatenate((data_1_nan,data_weather,data_2_nan),axis=0)
2304 data_filled = numpy.concatenate((data_1_nan,data_weather,data_2_nan),axis=0)
2300 #val_mean = numpy.mean(data_weather[:,-1])
2305 #val_mean = numpy.mean(data_weather[:,-1])
2301 #self.val_mean = val_mean
2306 #self.val_mean = val_mean
2302 print(data_filled)
2307 print(data_filled)
2303 data_filled = self.replaceNAN(data_weather=data_filled,data_ele=angles_filled,val=numpy.nan)
2308 data_filled = self.replaceNAN(data_weather=data_filled,data_ele=angles_filled,val=numpy.nan)
2304
2309
2305 print(data_filled)
2310 print(data_filled)
2306 print(data_filled.shape)
2311 print(data_filled.shape)
2307 print(angles_filled.shape)
2312 print(angles_filled.shape)
2308
2313
2309 return data_filled,angles_filled
2314 return data_filled,angles_filled
2310
2315
2311 def plot(self):
2316 def plot(self):
2312 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
2317 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
2313 data = self.data[-1]
2318 data = self.data[-1]
2314 r = self.data.yrange
2319 r = self.data.yrange
2315 delta_height = r[1]-r[0]
2320 delta_height = r[1]-r[0]
2316 r_mask = numpy.where(r>=0)[0]
2321 r_mask = numpy.where(r>=0)[0]
2317 self.r_mask =r_mask
2322 self.r_mask =r_mask
2318 ##print("delta_height",delta_height)
2323 ##print("delta_height",delta_height)
2319 #print("r_mask",r_mask,len(r_mask))
2324 #print("r_mask",r_mask,len(r_mask))
2320 r = numpy.arange(len(r_mask))*delta_height
2325 r = numpy.arange(len(r_mask))*delta_height
2321 self.y = 2*r
2326 self.y = 2*r
2322 res = 1
2327 res = 1
2323 ###print("data['weather'].shape[0]",data['weather'].shape[0])
2328 ###print("data['weather'].shape[0]",data['weather'].shape[0])
2324 ang_max = self.ang_max
2329 ang_max = self.ang_max
2325 ang_min = self.ang_min
2330 ang_min = self.ang_min
2326 var_ang =ang_max - ang_min
2331 var_ang =ang_max - ang_min
2327 step = (int(var_ang)/(res*data['weather'].shape[0]))
2332 step = (int(var_ang)/(res*data['weather'].shape[0]))
2328 ###print("step",step)
2333 ###print("step",step)
2329 #--------------------------------------------------------
2334 #--------------------------------------------------------
2330 ##print('weather',data['weather'].shape)
2335 ##print('weather',data['weather'].shape)
2331 ##print('ele',data['ele'].shape)
2336 ##print('ele',data['ele'].shape)
2332
2337
2333 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
2338 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
2334 ###self.res_azi = numpy.mean(data['azi'])
2339 ###self.res_azi = numpy.mean(data['azi'])
2335 ###print("self.res_ele",self.res_ele)
2340 ###print("self.res_ele",self.res_ele)
2336
2341
2337 plt.clf()
2342 plt.clf()
2338 subplots = [121, 122]
2343 subplots = [121, 122]
2339 #if self.ini==0:
2344 #if self.ini==0:
2340 #self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
2345 #self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
2341 #print("SHAPE",self.data_ele_tmp.shape)
2346 #print("SHAPE",self.data_ele_tmp.shape)
2342
2347
2343 for i,ax in enumerate(self.axes):
2348 for i,ax in enumerate(self.axes):
2344 res_weather, self.res_ele = self.const_ploteo_vRF(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],res=res,ang_max=ang_max,ang_min=ang_min)
2349 res_weather, self.res_ele = self.const_ploteo_vRF(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],res=res,ang_max=ang_max,ang_min=ang_min)
2345 self.res_azi = numpy.mean(data['azi'])
2350 self.res_azi = numpy.mean(data['azi'])
2346
2351
2347 if ax.firsttime:
2352 if ax.firsttime:
2348 #plt.clf()
2353 #plt.clf()
2349 print("Frist Plot")
2354 print("Frist Plot")
2350 print(data['weather'][i][:,r_mask].shape)
2355 print(data['weather'][i][:,r_mask].shape)
2351 print(data['ele'].shape)
2356 print(data['ele'].shape)
2352 cgax, pm = wrl.vis.plot_rhi(res_weather,r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
2357 cgax, pm = wrl.vis.plot_rhi(res_weather,r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
2353 #cgax, pm = wrl.vis.plot_rhi(data['weather'][i][:,r_mask],r=r,th=data['ele'],ax=subplots[i], proj='cg',vmin=20, vmax=80)
2358 #cgax, pm = wrl.vis.plot_rhi(data['weather'][i][:,r_mask],r=r,th=data['ele'],ax=subplots[i], proj='cg',vmin=20, vmax=80)
2354 gh = cgax.get_grid_helper()
2359 gh = cgax.get_grid_helper()
2355 locs = numpy.linspace(ang_min,ang_max,var_ang+1)
2360 locs = numpy.linspace(ang_min,ang_max,var_ang+1)
2356 gh.grid_finder.grid_locator1 = FixedLocator(locs)
2361 gh.grid_finder.grid_locator1 = FixedLocator(locs)
2357 gh.grid_finder.tick_formatter1 = DictFormatter(dict([(i, r"${0:.0f}^\circ$".format(i)) for i in locs]))
2362 gh.grid_finder.tick_formatter1 = DictFormatter(dict([(i, r"${0:.0f}^\circ$".format(i)) for i in locs]))
2358
2363
2359
2364
2360 #fig=self.figures[0]
2365 #fig=self.figures[0]
2361 else:
2366 else:
2362 #plt.clf()
2367 #plt.clf()
2363 print("ELSE PLOT")
2368 print("ELSE PLOT")
2364 cgax, pm = wrl.vis.plot_rhi(res_weather,r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
2369 cgax, pm = wrl.vis.plot_rhi(res_weather,r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
2365 #cgax, pm = wrl.vis.plot_rhi(data['weather'][i][:,r_mask],r=r,th=data['ele'],ax=subplots[i], proj='cg',vmin=20, vmax=80)
2370 #cgax, pm = wrl.vis.plot_rhi(data['weather'][i][:,r_mask],r=r,th=data['ele'],ax=subplots[i], proj='cg',vmin=20, vmax=80)
2366 gh = cgax.get_grid_helper()
2371 gh = cgax.get_grid_helper()
2367 locs = numpy.linspace(ang_min,ang_max,var_ang+1)
2372 locs = numpy.linspace(ang_min,ang_max,var_ang+1)
2368 gh.grid_finder.grid_locator1 = FixedLocator(locs)
2373 gh.grid_finder.grid_locator1 = FixedLocator(locs)
2369 gh.grid_finder.tick_formatter1 = DictFormatter(dict([(i, r"${0:.0f}^\circ$".format(i)) for i in locs]))
2374 gh.grid_finder.tick_formatter1 = DictFormatter(dict([(i, r"${0:.0f}^\circ$".format(i)) for i in locs]))
2370
2375
2371 caax = cgax.parasites[0]
2376 caax = cgax.parasites[0]
2372 paax = cgax.parasites[1]
2377 paax = cgax.parasites[1]
2373 cbar = plt.gcf().colorbar(pm, pad=0.075)
2378 cbar = plt.gcf().colorbar(pm, pad=0.075)
2374 caax.set_xlabel('x_range [km]')
2379 caax.set_xlabel('x_range [km]')
2375 caax.set_ylabel('y_range [km]')
2380 caax.set_ylabel('y_range [km]')
2376 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
2381 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
2377 print("***************************self.ini****************************",self.ini)
2382 print("***************************self.ini****************************",self.ini)
2378 self.ini= self.ini+1
2383 self.ini= self.ini+1
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now