2 Copyright (C) 2013 Swedish Meteorological and Hydrological Institute, SMHI,
4 This file is part of baltrad-wrwp.
6 baltrad-wrwp is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 baltrad-wrwp is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with baltrad-wrwp. If not, see <http://www.gnu.org/licenses/>.
18 ------------------------------------------------------------------------*/
20 Tests the wrwp module.
23 @author Anders Henja (Swedish Meteorological and Hydrological Institute, SMHI)
32 import xml.etree.cElementTree as ET
36 sys.path.append(os.path.realpath(__file__))
38 def strToNumber(strval):
39 # Converts a string into a number, either int or float
40 # strval: the string to translate
41 # return:the translated value
42 # throws ValueError if value not could be translated
43 if type(strval) is not str: # Avoid doing anything if it is not a string as input
51 # Parse the xml-file to get the default values, the file is placed in the directory below i.e. fixtures
52 root = ET.parse('./fixtures/wrwp_config.xml').getroot()
53 for param in root.findall('param'):
54 if param.get('name') == 'DMIN':
55 DMIN = strToNumber(param.find('value').text)
56 if param.get('name') == 'DMAX':
57 DMAX = strToNumber(param.find('value').text)
58 if param.get('name') == 'NMIN_WND':
59 NMIN_WND = strToNumber(param.find('value').text)
60 if param.get('name') == 'NMIN_REF':
61 NMIN_REF = strToNumber(param.find('value').text)
62 if param.get('name') == 'EMIN':
63 EMIN = strToNumber(param.find('value').text)
64 if param.get('name') == 'EMAX':
65 EMAX = strToNumber(param.find('value').text)
66 if param.get('name') == 'VMIN':
67 VMIN = strToNumber(param.find('value').text)
68 if param.get('name') == 'FF_MAX':
69 FF_MAX = strToNumber(param.find('value').text)
70 if param.get('name') == 'DZ':
71 DZ = strToNumber(param.find('value').text)
72 if param.get('name') == 'HMAX':
73 HMAX = strToNumber(param.find('value').text)
74 if param.get('name') == 'NODATA_VP':
75 NODATA_VP = strToNumber(param.find('value').text)
76 if param.get('name') == 'UNDETECT_VP':
77 UNDETECT_VP = strToNumber(param.find('value').text)
78 if param.get('name') == 'GAIN_VP':
79 GAIN_VP = strToNumber(param.find('value').text)
80 if param.get('name') == 'OFFSET_VP':
81 OFFSET_VP = strToNumber(param.find('value').text)
82 if param.get('name') == 'QUANTITIES':
83 QUANTITIES = param.find('value').text
86 def load_wrwp_defaults_to_obj():
93 wrwp.nmin_wnd = NMIN_WND
94 wrwp.nmin_ref = NMIN_REF
98 wrwp.nodata_VP = NODATA_VP
99 wrwp.undetect_VP = UNDETECT_VP
100 wrwp.gain_VP = GAIN_VP
101 wrwp.offset_VP = OFFSET_VP
105 class WrwpTest(unittest.TestCase):
106 FIXTURE = "fixtures/pvol_seang_20090501T120000Z.h5"
107 FIXTURE2 = "fixtures/selul_pvol_20151114T1615Z.h5"
108 FIXTURE3 = "fixtures/seang_zdr_qcvol_one_scan_and_elangle_lower_than_wrwp_threshold.h5"
109 FIXTURE4 = "fixtures/seosd_qcvol_zdrvol_different_task.h5"
112 _helpers.triggerMemoryStatus()
119 self.assertNotEqual(-1, str(type(obj)).find("WrwpCore"))
121 def test_load_wrwp_defaults_to_obj(self):
122 obj = load_wrwp_defaults_to_obj()
123 self.assertEqual(200, obj.dz)
124 self.assertEqual(12000, obj.hmax)
125 self.assertEqual(5000, obj.dmin)
126 self.assertEqual(25000, obj.dmax)
127 self.assertAlmostEqual(0.5, obj.emin, 4)
128 self.assertAlmostEqual(45.0, obj.emax, 4)
129 self.assertAlmostEqual(2.0, obj.vmin, 4)
130 self.assertAlmostEqual(60.0, obj.ff_max, 4)
131 self.assertEqual(40, obj.nmin_wnd, 4)
132 self.assertEqual(40, obj.nmin_ref, 4)
136 self.assertEqual(200, obj.dz)
138 self.assertEqual(100, obj.dz)
141 self.fail("Expected TypeError")
144 self.assertEqual(100, obj.dz)
148 self.assertEqual(12000, obj.hmax)
150 self.assertEqual(100, obj.hmax)
153 self.fail("Expected TypeError")
156 self.assertEqual(100, obj.hmax)
160 self.assertEqual(5000, obj.dmin)
162 self.assertEqual(100, obj.dmin)
165 self.fail("Expected TypeError")
168 self.assertEqual(100, obj.dmin)
172 self.assertEqual(25000, obj.dmax)
174 self.assertEqual(100, obj.dmax)
177 self.fail("Expected TypeError")
180 self.assertEqual(100, obj.dmax)
184 self.assertAlmostEqual(0.5, obj.emin, 4)
186 self.assertAlmostEqual(3.5, obj.emin, 4)
188 self.assertAlmostEqual(4.0, obj.emin, 4)
192 self.assertAlmostEqual(45.0, obj.emax, 4)
194 self.assertAlmostEqual(35.0, obj.emax, 4)
196 self.assertAlmostEqual(4.0, obj.emax, 4)
200 self.assertAlmostEqual(2.0, obj.vmin, 4)
202 self.assertAlmostEqual(3.5, obj.vmin, 4)
204 self.assertAlmostEqual(4.0, obj.vmin, 4)
206 def test_ff_max(self):
208 self.assertAlmostEqual(60.0, obj.ff_max, 4)
210 self.assertAlmostEqual(3.5, obj.ff_max, 4)
212 self.assertAlmostEqual(90.0, obj.ff_max, 4)
214 def test_nmin_wnd(self):
216 self.assertEqual(40, obj.nmin_wnd, 4)
218 self.assertEqual(70, obj.nmin_wnd, 4)
220 self.assertEqual(20, obj.nmin_wnd, 4)
222 def test_nmin_ref(self):
224 self.assertEqual(40, obj.nmin_ref, 4)
226 self.assertEqual(70, obj.nmin_ref, 4)
228 self.assertEqual(20, obj.nmin_ref, 4)
230 def test_generate(self):
231 pvol = _raveio.open(self.FIXTURE).object
232 wrwp = load_wrwp_defaults_to_obj()
238 vp = wrwp.generate(pvol, fields)
245 self.assertEqual(1, uwnd.xsize)
246 self.assertEqual(10, uwnd.ysize)
247 self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
249 self.assertEqual(1, vwnd.xsize)
250 self.assertEqual(10, vwnd.ysize)
251 self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
253 self.assertEqual(1, hght.xsize)
254 self.assertEqual(10, hght.ysize)
255 self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
257 self.assertEqual(1, nv.xsize)
258 self.assertEqual(10, nv.ysize)
259 self.assertEqual("n", nv.getAttribute("what/quantity"))
261 self.assertEqual(10,vp.getLevels())
262 self.assertEqual(200, vp.interval)
263 self.assertEqual(0, vp.minheight)
264 self.assertEqual(2000, vp.maxheight)
265 self.assertEqual(pvol.source, vp.source)
266 self.assertEqual(pvol.date, vp.date)
267 self.assertEqual(pvol.time, vp.time)
269 def test_generate_from_default(self):
270 pvol = _raveio.open(self.FIXTURE).object
271 wrwp = load_wrwp_defaults_to_obj()
274 exceptionTest = False
276 vp = wrwp.generate(pvol, fields)
281 dbzh_dev = vp.getDBZDev()
285 self.assertEqual(1, ff.xsize)
286 self.assertEqual(60, ff.ysize)
287 self.assertEqual("ff", ff.getAttribute("what/quantity"))
289 self.assertEqual(1, dd.xsize)
290 self.assertEqual(60, dd.ysize)
291 self.assertEqual("dd", dd.getAttribute("what/quantity"))
293 self.assertEqual(1, dbzh.xsize)
294 self.assertEqual(60, dbzh.ysize)
295 self.assertEqual("DBZH", dbzh.getAttribute("what/quantity"))
297 self.assertEqual(1, dbzh_dev.xsize)
298 self.assertEqual(60, dbzh_dev.ysize)
299 self.assertEqual("DBZH_dev", dbzh_dev.getAttribute("what/quantity"))
301 self.assertEqual(1, NZ.xsize)
302 self.assertEqual(60, NZ.ysize)
303 self.assertEqual("nz", NZ.getAttribute("what/quantity"))
305 self.assertEqual(60,vp.getLevels())
306 self.assertEqual(200, vp.interval)
307 self.assertEqual(0, vp.minheight)
308 self.assertEqual(12000, vp.maxheight)
309 self.assertEqual(pvol.source, vp.source)
310 self.assertEqual(pvol.date, vp.date)
311 self.assertEqual(pvol.time, vp.time)
314 self.assertEqual(1, uwnd.xsize)
315 self.assertEqual(60, uwnd.ysize)
316 self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
320 self.assertEqual(True, exceptionTest)
323 def X_test_generate_2(self):
324 pvol = _raveio.open(self.FIXTURE).object
325 wrwp = load_wrwp_defaults_to_obj()
330 vp = wrwp.generate(pvol, fields)
334 robj.save("slasktest.h5")
336 def test_generate_with_several_howattributes(self):
337 pvol = _raveio.open(self.FIXTURE2).object
338 wrwp = load_wrwp_defaults_to_obj()
344 vp = wrwp.generate(pvol, fields)
351 self.assertEqual(1, uwnd.xsize)
352 self.assertEqual(10, uwnd.ysize)
353 self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
355 self.assertEqual(1, vwnd.xsize)
356 self.assertEqual(10, vwnd.ysize)
357 self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
359 self.assertEqual(1, hght.xsize)
360 self.assertEqual(10, hght.ysize)
361 self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
363 self.assertEqual(1, nv.xsize)
364 self.assertEqual(10, nv.ysize)
365 self.assertEqual("n", nv.getAttribute("what/quantity"))
367 self.assertEqual(10, vp.getLevels())
368 self.assertEqual(200, vp.interval)
369 self.assertEqual(0, vp.minheight)
370 self.assertEqual(2000, vp.maxheight)
371 self.assertEqual(pvol.source, vp.source)
372 self.assertEqual(pvol.date, vp.date)
373 self.assertEqual(pvol.time, vp.time)
375 '''self.assertEqual(900, vp.getAttribute("how/lowprf"))
376 self.assertEqual(1200, vp.getAttribute("how/highprf"))
377 self.assertAlmostEqual(0.61, vp.getAttribute("how/pulsewidth"), 4)
378 self.assertAlmostEqual(5.35, vp.getAttribute("how/wavelength"), 4)
379 self.assertAlmostEqual(0.8, vp.getAttribute("how/RXbandwidth"), 4)
380 self.assertAlmostEqual(3.1, vp.getAttribute("how/RXlossH"), 4)
381 self.assertAlmostEqual(1.9, vp.getAttribute("how/TXlossH"), 4)
382 self.assertAlmostEqual(44.9, vp.getAttribute("how/antgainH"), 4)
383 self.assertEqual("AVERAGE", vp.getAttribute("how/azmethod"))
384 self.assertEqual("AVERAGE", vp.getAttribute("how/binmethod"))
385 self.assertEqual("False", vp.getAttribute("how/malfunc"))
386 self.assertAlmostEqual(277.4, vp.getAttribute("how/nomTXpower"), 4)
387 self.assertEqual("b94 3dd 000 000 000:", vp.getAttribute("how/radar_msg"), 4)
388 self.assertAlmostEqual(73.101, vp.getAttribute("how/radconstH"), 4)
389 self.assertAlmostEqual(0.2, vp.getAttribute("how/radomelossH"), 4)
390 self.assertAlmostEqual(2.0, vp.getAttribute("how/rpm"), 4)
391 self.assertEqual("PARTEC2", vp.getAttribute("how/software"))
392 self.assertEqual("ERIC", vp.getAttribute("how/system"))'''
393 self.assertEqual(5.0, vp.getAttribute("how/minrange"))
394 self.assertEqual(25.0, vp.getAttribute("how/maxrange"))
398 robj.save("slask1.h5")
400 def test_second_generate_with_several_howattributes(self):
401 pvol = _raveio.open(self.FIXTURE3).object
402 wrwp = load_wrwp_defaults_to_obj()
406 exceptionTest = False
410 vp = wrwp.generate(pvol, fields)
417 self.assertEqual(1, uwnd.xsize)
418 self.assertEqual(60, uwnd.ysize)
419 self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
421 self.assertEqual(1, vwnd.xsize)
422 self.assertEqual(60, vwnd.ysize)
423 self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
425 self.assertEqual(1, hght.xsize)
426 self.assertEqual(60, hght.ysize)
427 self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
429 self.assertEqual(1, nv.xsize)
430 self.assertEqual(60, nv.ysize)
431 self.assertEqual("n", nv.getAttribute("what/quantity"))
433 self.assertEqual(60, vp.getLevels())
434 self.assertEqual(200, vp.interval)
435 self.assertEqual(0, vp.minheight)
436 self.assertEqual(12000, vp.maxheight)
437 self.assertEqual(pvol.source, vp.source)
438 self.assertEqual(pvol.date, vp.date)
439 self.assertEqual(pvol.time, vp.time)
441 '''self.assertEqual(450, vp.getAttribute("how/lowprf"))
442 self.assertEqual(600, vp.getAttribute("how/highprf"))
443 self.assertAlmostEqual(0.5, vp.getAttribute("how/pulsewidth"), 4)
444 self.assertAlmostEqual(5.348660945892334, vp.getAttribute("how/wavelength"), 4)
445 self.assertAlmostEqual(2.5, vp.getAttribute("how/RXbandwidth"), 4)
446 self.assertAlmostEqual(1.600000023841858, vp.getAttribute("how/RXlossH"), 4)
447 self.assertAlmostEqual(2.3000001907348633, vp.getAttribute("how/TXlossH"), 4)
448 self.assertAlmostEqual(44.290000915527344, vp.getAttribute("how/antgainH"), 4)
449 self.assertEqual("AVERAGE", vp.getAttribute("how/azmethod"))
450 self.assertEqual("AVERAGE", vp.getAttribute("how/binmethod"))
451 self.assertEqual("False", vp.getAttribute("how/malfunc"))
452 self.assertAlmostEqual(270.0, vp.getAttribute("how/nomTXpower"), 4)
453 self.assertEqual("", vp.getAttribute("how/radar_msg"), 4)
454 self.assertAlmostEqual(71.4227294921875, vp.getAttribute("how/radconstH"), 4)
455 self.assertAlmostEqual(3.0, vp.getAttribute("how/rpm"), 4)
456 self.assertEqual("EDGE", vp.getAttribute("how/software"))
457 self.assertEqual("EECDWSR-2501C-SDP", vp.getAttribute("how/system"))'''
458 self.assertEqual(5.0, vp.getAttribute("how/minrange"))
459 self.assertEqual(25.0, vp.getAttribute("how/maxrange"))
463 robj.save("slask2.h5")
467 self.assertEqual(True, exceptionTest)
469 def test_third_generate_with_several_howattributes(self):
470 pvol = _raveio.open(self.FIXTURE4).object
471 wrwp = load_wrwp_defaults_to_obj()
475 exceptionTest = False
479 vp = wrwp.generate(pvol, fields)
486 self.assertEqual(1, uwnd.xsize)
487 self.assertEqual(60, uwnd.ysize)
488 self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
490 self.assertEqual(1, vwnd.xsize)
491 self.assertEqual(60, vwnd.ysize)
492 self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
494 self.assertEqual(1, hght.xsize)
495 self.assertEqual(60, hght.ysize)
496 self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
498 self.assertEqual(1, nv.xsize)
499 self.assertEqual(60, nv.ysize)
500 self.assertEqual("n", nv.getAttribute("what/quantity"))
502 self.assertEqual(60, vp.getLevels())
503 self.assertEqual(200, vp.interval)
504 self.assertEqual(0, vp.minheight)
505 self.assertEqual(12000, vp.maxheight)
506 self.assertEqual(pvol.source, vp.source)
507 self.assertEqual(pvol.date, vp.date)
508 self.assertEqual(pvol.time, vp.time)
510 self.assertEqual(5.0, vp.getAttribute("how/minrange"))
511 self.assertEqual(25.0, vp.getAttribute("how/maxrange"))
512 self.assertEqual("4.0,8.0,14.0,24.0,40.0", vp.getAttribute("how/angles"))
513 self.assertEqual("osd_zdr,osd_zdr_fastshort,osd_ldr_fastshort,osd_zdr_longshort", vp.getAttribute("how/task"))
517 robj.save("slask3.h5")
521 self.assertEqual(False, exceptionTest)
524 if __name__ == "__main__":