Fix
[baltrad-wrwp.git] / pywrwp / baltrad_wrwp_pgf_plugin.py
1 '''
2 Copyright (C) 2010- Swedish Meteorological and Hydrological Institute (SMHI)
3
4 This file is part of RAVE.
5
6 RAVE is free software: you can redistribute it and/or modify
7 it under the terms of the GNU Lesser 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 RAVE 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.
14 See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with RAVE.  If not, see <http://www.gnu.org/licenses/>.
18
19 '''
20 ## Plugin for generating the wrwp product generation that is initiated from the beast
21 ## framework.
22 ## Register in pgf with
23 ## --name=eu.baltrad.beast.GenerateAcrr
24 ## --floats=minelevationangle,velocitythreshold --ints=interval,maxheight,mindistance,maxdistance -m baltrad_wrwp_pgf_plugin -f generate
25 ##
26 ## The WRWP generation is executed by providing a polar volume that a wind profile is calculated on
27 ##
28 ## wrwp = _wrwp.new()
29 ## wrwp.interval = ...
30 ## wrwp.maxheight = ...
31 ## ...
32 ## result = wrwp.generate(pvol)
33 ## 
34 ## @file
35 ## @author Anders Henja, SMHI
36 ## @date 2013-09-25
37
38 import _wrwp
39 import _rave
40 import _raveio
41 import _polarvolume
42 import string
43 import rave_tempfile
44 import odim_source
45 import math
46 import logging
47 import rave_pgf_logger
48
49 from rave_defines import CENTER_ID, GAIN, OFFSET, LOG_ID
50
51 logger = logging.getLogger(LOG_ID)
52
53 ravebdb = None
54 try:
55   import rave_bdb
56   ravebdb = rave_bdb.rave_bdb()
57 except:
58   pass
59
60 ## Creates a dictionary from a rave argument list
61 #@param arglist the argument list
62 #@return a dictionary
63 def arglist2dict(arglist):
64   result={}
65   for i in range(0, len(arglist), 2):
66     result[arglist[i]] = arglist[i+1]
67   return result
68
69 ##
70 # Converts a string into a number, either int or float
71 # @param sval the string to translate
72 # @return the translated value
73 # @throws ValueError if value not could be translated
74 #
75 def strToNumber(sval):
76   try:
77     return int(sval)
78   except ValueError, e:
79     return float(sval)
80
81 ## Creates a composite
82 #@param files the list of files to be used for generating the composite
83 #@param arguments the arguments defining the composite
84 #@return a temporary h5 file with the composite
85 def generate(files, arguments):
86   args = arglist2dict(arguments)
87   wrwp = _wrwp.new()
88   
89   if "interval" in args.keys():
90     wrwp.dz = strToNumber(args["interval"])
91   if "maxheight" in args.keys():
92     wrwp.hmax = strToNumber(args["maxheight"])
93   if "mindistance" in args.keys():
94     wrwp.dmin = args["mindistance"]
95   if "maxdistance" in args.keys():
96     wrwp.dmax = strToNumber(args["maxdistance"]) 
97   if "minelevationangle" in args.keys():
98     wrwp.emin = strToNumber(args["minelevationangle"])
99   if "velocitythreshold" in args.keys():
100     wrwp.vmin = strToNumber(args["velocitythreshold"])
101
102   if len(files) != 1:
103     raise AttributeError, "Must call plugin with _one_ polar volume"
104
105   obj = None
106   if ravebdb != None:
107     obj = ravebdb.get_rave_object(files[0])
108   else:
109     rio = _raveio.open(files[0])
110     obj = rio.object
111
112   if not _polarvolume.isPolarVolume(obj):
113     raise AttributeError, "Must call plugin with a polar volume"
114
115   profile = wrwp.generate(obj)
116   
117   fileno, outfile = rave_tempfile.mktemp(suffix='.h5', close="True")
118   
119   ios = _raveio.new()
120   ios.object = profile
121   ios.filename = outfile
122   ios.save()
123
124   return outfile