Ticket 864: Add configurable RAVEIO version when writing files.
[baltrad-wrwp.git] / test / pytest / WrwpTest.py
1 '''
2 Copyright (C) 2013 Swedish Meteorological and Hydrological Institute, SMHI,
3
4 This file is part of baltrad-wrwp.
5
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.
10
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.
15
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 ------------------------------------------------------------------------*/
19
20 Tests the wrwp module.
21
22 @file
23 @author Anders Henja (Swedish Meteorological and Hydrological Institute, SMHI)
24 @date 2013-09-17
25 '''
26
27 import unittest
28 import string
29 import _wrwp
30 import _helpers
31 import _raveio, _rave
32 import xml.etree.cElementTree as ET
33 import sys
34 import os
35
36 sys.path.append(os.path.realpath(__file__))
37
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
44     return strval
45   else:
46     try:
47       return int(strval)
48     except ValueError:
49       return float(strval)
50
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
84
85
86 def load_wrwp_defaults_to_obj():
87   wrwp = _wrwp.new()
88   wrwp.hmax = HMAX
89   wrwp.dz = DZ
90   wrwp.emin = EMIN
91   wrwp.dmin = DMIN
92   wrwp.dmax = DMAX
93   wrwp.nmin_wnd = NMIN_WND
94   wrwp.nmin_ref = NMIN_REF
95   wrwp.emax = EMAX
96   wrwp.vmin = VMIN
97   wrwp.ff_max = FF_MAX
98   wrwp.nodata_VP = NODATA_VP
99   wrwp.undetect_VP = UNDETECT_VP
100   wrwp.gain_VP = GAIN_VP
101   wrwp.offset_VP = OFFSET_VP
102
103   return wrwp
104
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"
110   
111   def setUp(self):
112     _helpers.triggerMemoryStatus()
113
114   def tearDown(self):
115     pass
116
117   def test_new(self):
118     obj = _wrwp.new()
119     self.assertNotEqual(-1, str(type(obj)).find("WrwpCore"))
120
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)
133     
134   def test_dz(self):
135     obj = _wrwp.new()
136     self.assertEqual(200, obj.dz)
137     obj.dz = 100
138     self.assertEqual(100, obj.dz)
139     try:
140       obj.dz = 200.0
141       self.fail("Expected TypeError")
142     except TypeError:
143       pass
144     self.assertEqual(100, obj.dz)
145
146   def test_hmax(self):
147     obj = _wrwp.new()
148     self.assertEqual(12000, obj.hmax)
149     obj.hmax = 100
150     self.assertEqual(100, obj.hmax)
151     try:
152       obj.hmax = 200.0
153       self.fail("Expected TypeError")
154     except TypeError:
155       pass
156     self.assertEqual(100, obj.hmax)
157
158   def test_dmin(self):
159     obj = _wrwp.new()
160     self.assertEqual(5000, obj.dmin)
161     obj.dmin = 100
162     self.assertEqual(100, obj.dmin)
163     try:
164       obj.dmin = 200.0
165       self.fail("Expected TypeError")
166     except TypeError:
167       pass
168     self.assertEqual(100, obj.dmin)
169     
170   def test_dmax(self):
171     obj = _wrwp.new()
172     self.assertEqual(25000, obj.dmax)
173     obj.dmax = 100
174     self.assertEqual(100, obj.dmax)
175     try:
176       obj.dmax = 200.0
177       self.fail("Expected TypeError")
178     except TypeError:
179       pass
180     self.assertEqual(100, obj.dmax)
181
182   def test_emin(self):
183     obj = _wrwp.new()
184     self.assertAlmostEqual(0.5, obj.emin, 4)
185     obj.emin = 3.5
186     self.assertAlmostEqual(3.5, obj.emin, 4)
187     obj.emin = 4
188     self.assertAlmostEqual(4.0, obj.emin, 4)
189
190   def test_emax(self):
191     obj = _wrwp.new()
192     self.assertAlmostEqual(45.0, obj.emax, 4)
193     obj.emax = 35.0
194     self.assertAlmostEqual(35.0, obj.emax, 4)
195     obj.emax = 4
196     self.assertAlmostEqual(4.0, obj.emax, 4)
197
198   def test_vmin(self):
199     obj = _wrwp.new()
200     self.assertAlmostEqual(2.0, obj.vmin, 4)
201     obj.vmin = 3.5
202     self.assertAlmostEqual(3.5, obj.vmin, 4)
203     obj.vmin = 4
204     self.assertAlmostEqual(4.0, obj.vmin, 4)
205
206   def test_ff_max(self):
207     obj = _wrwp.new()
208     self.assertAlmostEqual(60.0, obj.ff_max, 4)
209     obj.ff_max = 3.5
210     self.assertAlmostEqual(3.5, obj.ff_max, 4)
211     obj.ff_max = 90.0
212     self.assertAlmostEqual(90.0, obj.ff_max, 4)
213
214   def test_nmin_wnd(self):
215     obj = _wrwp.new()
216     self.assertEqual(40, obj.nmin_wnd, 4)
217     obj.nmin_wnd = 70
218     self.assertEqual(70, obj.nmin_wnd, 4)
219     obj.nmin_wnd = 20
220     self.assertEqual(20, obj.nmin_wnd, 4)
221
222   def test_nmin_ref(self):
223     obj = _wrwp.new()
224     self.assertEqual(40, obj.nmin_ref, 4)
225     obj.nmin_ref = 70
226     self.assertEqual(70, obj.nmin_ref, 4)
227     obj.nmin_ref = 20
228     self.assertEqual(20, obj.nmin_ref, 4)
229
230   def test_generate(self):
231     pvol = _raveio.open(self.FIXTURE).object
232     wrwp = load_wrwp_defaults_to_obj()
233     wrwp.hmax = 2000
234     wrwp.dz = 200
235     fields = None
236     
237     fields = QUANTITIES
238     vp = wrwp.generate(pvol, fields)
239     
240     uwnd = vp.getUWND()
241     vwnd = vp.getVWND()
242     hght = vp.getHGHT()
243     nv = vp.getNV()
244     
245     self.assertEqual(1, uwnd.xsize)
246     self.assertEqual(10, uwnd.ysize)
247     self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
248
249     self.assertEqual(1, vwnd.xsize)
250     self.assertEqual(10, vwnd.ysize)
251     self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
252
253     self.assertEqual(1, hght.xsize)
254     self.assertEqual(10, hght.ysize)
255     self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
256     
257     self.assertEqual(1, nv.xsize)
258     self.assertEqual(10, nv.ysize)
259     self.assertEqual("n", nv.getAttribute("what/quantity"))
260
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)
268
269   def test_generate_from_default(self):
270     pvol = _raveio.open(self.FIXTURE).object
271     wrwp = load_wrwp_defaults_to_obj()
272     fields = None
273
274     exceptionTest = False
275
276     vp = wrwp.generate(pvol, fields)
277
278     ff = vp.getFF()
279     dd = vp.getDD()
280     dbzh = vp.getDBZ()
281     dbzh_dev = vp.getDBZDev()
282     NZ = vp.getNZ()
283     uwnd = vp.getUWND()
284
285     self.assertEqual(1, ff.xsize)
286     self.assertEqual(60, ff.ysize)
287     self.assertEqual("ff", ff.getAttribute("what/quantity"))
288
289     self.assertEqual(1, dd.xsize)
290     self.assertEqual(60, dd.ysize)
291     self.assertEqual("dd", dd.getAttribute("what/quantity"))
292
293     self.assertEqual(1, dbzh.xsize)
294     self.assertEqual(60, dbzh.ysize)
295     self.assertEqual("DBZH", dbzh.getAttribute("what/quantity"))
296
297     self.assertEqual(1, dbzh_dev.xsize)
298     self.assertEqual(60, dbzh_dev.ysize)
299     self.assertEqual("DBZH_dev", dbzh_dev.getAttribute("what/quantity"))
300
301     self.assertEqual(1, NZ.xsize)
302     self.assertEqual(60, NZ.ysize)
303     self.assertEqual("nz", NZ.getAttribute("what/quantity"))
304
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)
312
313     try:
314       self.assertEqual(1, uwnd.xsize)
315       self.assertEqual(60, uwnd.ysize)
316       self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
317     except:
318       exceptionTest = True
319
320     self.assertEqual(True, exceptionTest)
321
322     
323   def X_test_generate_2(self):
324     pvol = _raveio.open(self.FIXTURE).object
325     wrwp = load_wrwp_defaults_to_obj()
326     wrwp.hmax = 2000
327     wrwp.dz = 200
328     fields = None
329     
330     vp = wrwp.generate(pvol, fields)
331
332     robj = _raveio.new()
333     robj.object = vp
334     robj.save("slasktest.h5")
335
336   def test_generate_with_several_howattributes(self):
337     pvol = _raveio.open(self.FIXTURE2).object
338     wrwp = load_wrwp_defaults_to_obj()
339     wrwp.hmax = 2000
340     wrwp.dz = 200
341     fields = None
342     
343     fields = QUANTITIES
344     vp = wrwp.generate(pvol, fields)
345     
346     uwnd = vp.getUWND()
347     vwnd = vp.getVWND()
348     hght = vp.getHGHT()
349     nv = vp.getNV()
350
351     self.assertEqual(1, uwnd.xsize)
352     self.assertEqual(10, uwnd.ysize)
353     self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
354
355     self.assertEqual(1, vwnd.xsize)
356     self.assertEqual(10, vwnd.ysize)
357     self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
358
359     self.assertEqual(1, hght.xsize)
360     self.assertEqual(10, hght.ysize)
361     self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
362
363     self.assertEqual(1, nv.xsize)
364     self.assertEqual(10, nv.ysize)
365     self.assertEqual("n", nv.getAttribute("what/quantity"))
366
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)
374     
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"))
395
396     robj = _raveio.new()
397     robj.object = vp
398     robj.save("slask1.h5")
399
400   def test_second_generate_with_several_howattributes(self):
401     pvol = _raveio.open(self.FIXTURE3).object
402     wrwp = load_wrwp_defaults_to_obj()
403     wrwp.emin = 4.0
404     fields = None
405
406     exceptionTest = False
407
408     try:
409       fields = QUANTITIES
410       vp = wrwp.generate(pvol, fields)
411
412       uwnd = vp.getUWND()
413       vwnd = vp.getVWND()
414       hght = vp.getHGHT()
415       nv = vp.getNV()
416
417       self.assertEqual(1, uwnd.xsize)
418       self.assertEqual(60, uwnd.ysize)
419       self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
420
421       self.assertEqual(1, vwnd.xsize)
422       self.assertEqual(60, vwnd.ysize)
423       self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
424
425       self.assertEqual(1, hght.xsize)
426       self.assertEqual(60, hght.ysize)
427       self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
428
429       self.assertEqual(1, nv.xsize)
430       self.assertEqual(60, nv.ysize)
431       self.assertEqual("n", nv.getAttribute("what/quantity"))
432
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)
440     
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"))
460
461       robj = _raveio.new()
462       robj.object = vp
463       robj.save("slask2.h5")
464     except:
465       exceptionTest = True
466
467     self.assertEqual(True, exceptionTest)
468
469   def test_third_generate_with_several_howattributes(self):
470     pvol = _raveio.open(self.FIXTURE4).object
471     wrwp = load_wrwp_defaults_to_obj()
472     wrwp.emin = 4.0
473     fields = None
474
475     exceptionTest = False
476
477     try:
478       fields = QUANTITIES
479       vp = wrwp.generate(pvol, fields)
480
481       uwnd = vp.getUWND()
482       vwnd = vp.getVWND()
483       hght = vp.getHGHT()
484       nv = vp.getNV()
485
486       self.assertEqual(1, uwnd.xsize)
487       self.assertEqual(60, uwnd.ysize)
488       self.assertEqual("UWND", uwnd.getAttribute("what/quantity"))
489
490       self.assertEqual(1, vwnd.xsize)
491       self.assertEqual(60, vwnd.ysize)
492       self.assertEqual("VWND", vwnd.getAttribute("what/quantity"))
493
494       self.assertEqual(1, hght.xsize)
495       self.assertEqual(60, hght.ysize)
496       self.assertEqual("HGHT", hght.getAttribute("what/quantity"))
497
498       self.assertEqual(1, nv.xsize)
499       self.assertEqual(60, nv.ysize)
500       self.assertEqual("n", nv.getAttribute("what/quantity"))
501
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)
509
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"))
514
515       robj = _raveio.new()
516       robj.object = vp
517       robj.save("slask3.h5")
518     except:
519       exceptionTest = True
520
521     self.assertEqual(False, exceptionTest)
522
523
524 if __name__ == "__main__":
525   unittest.main()