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