source: lmdz_wrf/trunk/tools/generic.py @ 812

Last change on this file since 812 was 809, checked in by lfita, 9 years ago

Adding new functions
Adding 'cE' as the character for spaces
Using 'cV' as character to split multiple values

File size: 11.3 KB
Line 
1# Wrapper for the generic functions written in python from 'generic_tools.py'
2# L. Fita, LMD. June 2016
3
4from optparse import OptionParser
5import numpy as np
6import datetime as dt
7import generic_tools as gen
8
9main = 'generic_tools.py'
10errormsg = 'ERROR -- error -- ERROR -- error'
11warnmsg = 'WARNING -- warning --WARNING -- warning'
12import os
13import re
14
15# Character to split passed values
16cS = ','
17# Character to split serie of values
18cV = '@'
19# Character for spaces
20cE = '!'
21
22# List of available operations
23operations=['coincident_CFtimes', 'count_cond', 'datetimeStr_conversion',            \
24  'grid_combinations',                                                               \
25  'interpolate_locs', 'PolyArea',                                                    \
26  'radial_points', 'radius_dist',                                                    \
27  'rmNOnum', 'running_mean',                                                         \
28  'significant_decomposition', 'squared_radial',                                     \
29  'table_tex_file', 'unitsDate', 'wdismean']
30
31hundredvals = '0'
32for i in range(1,100): hundredvals = hundredvals + cV + str(i)
33
34vs100 = '0@1@2@3@4@5@6@7@8@9@10@11@12@13@14@15@16@17@18@19@20@21@22@23@24@25@26@27'
35vs100 = vs100 + '@28@29@30@31@32@33@34@35@36@37@38@39@40@41@42@43@44@45@46@47@48@49'
36vs100 = vs100 + '@50@51@52@53@54@55@56@57@58@59@60@61@62@63@64@65@66@67@68@69@70@71'
37va100 = vs100 + '@72@73@74@75@76@77@78@79@80@81@82@83@84@85@86@87@88@89@90@91@92@93'
38va100 = vs100 + '@94@95@96@97@98@99'
39
40## e.g. # generic.py -o 'coincident_CFtimes' -S '0@1@2@3@4@5@6@7@8@9,seconds since 1949-12-01 00:00:00,hours since 1949-12-01 00:00:00'
41## e.g. # generic.py -o count_cond -S 0@1@2@3@4@5@6@7@8@9,4,le
42## e.g. # generic.py -o datetimeStr_conversion -S '1976-02-17_08:32:05,Y-m-d_H:M:S,matYmdHMS'
43## e.g. # generic.py -o grid_combinations -S 1,2
44## e.g. # generic.py -o interpolate_locs -S -1.2@2.4@5.6@7.8@12.0,0.5@2.5,lin
45## e.g. # generic.py -o PolyArea -S -0.5@0.5@0.5@-0.5,0.5@0.5@-0.5@-0.5
46## e.g. # generic.py -o radial_points -S 0.785398163397,5
47## e.g. # generic.py -o radius_dist -S 3,5,2,2
48## e.g. # generic.py -o rmNOnum -S LMD123IPSL
49## e.g. # generic.py -o significant_decomposition -S 3.576,-2,0@1@2@3@4@5@6@7@8@9@10@11@12@13@14,a@b@c@d@e,i@ii@iii,table.tex
50## e.g. # generic.py -o table_tex_file -S '5,3,0@5@10@1@6@11@2@7@12@3@8@13@4@9@14,!@a@b@c@d@e,i@ii@iii,table.tex'
51## e.g. # generic.py -o unitsDate -S '19490101000000,19760217082932,second'
52## e.g. # generic.py -o running_mean -S 0@1@2@3@4@5@6@7@8@9,10
53## e.g. # generic.py -o squared_radial -S 3
54## e.g. # generic.py -o wdismean -S 0.005@0.005,0.@1.@2.@3.
55
56operationnames = "'" + gen.numVector_String(operations, "', '") + "'"
57valuesinf = "'" + cS + "' list of values to use according to the operation ('" + cV +\
58  "' for list of values)"
59
60parser = OptionParser()
61parser.add_option("-o", "--operation", type='choice', dest="operation", 
62  choices=operations, help="operation to make: " + operationnames, metavar="OPER")
63parser.add_option("-S", "--valueS (when applicable)", dest="values", 
64  help=valuesinf, metavar="VALUES")
65(opts, args) = parser.parse_args()
66
67#######    #######
68## MAIN
69    #######
70oper = opts.operation
71
72if oper == 'list_operations':
73# From: http://www.diveintopython.net/power_of_introspection/all_together.html
74    object = gen
75    for opern in operations:
76        if  opern != 'list_operations': 
77            print opern + '_______ ______ _____ ____ ___ __ _'
78            print getattr(object, opern).__doc__
79
80elif oper == 'coincident_CFtimes':
81    Nvals = 3
82    vals = opts.values.split(cS)
83    if vals[0] == 'h':
84        print gen.coincident_CFtimes.__doc__
85        quit(-1)
86    else:
87        if len(vals) != Nvals:
88            print errormsg
89            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
90              len(vals), ' has passed!!'
91            print gen.coincident_CFtimes.__doc__
92            quit(-1)
93        vals0 = np.array(vals[0].split(cV), dtype=np.float)
94        print gen.coincident_CFtimes(vals0, vals[1], vals[2])
95
96elif oper == 'count_cond':
97    Nvals = 3
98    vals = opts.values.split(cS)
99    if vals[0] == 'h':
100        print gen.count_cond.__doc__
101        quit(-1)
102    else:
103        if len(vals) != Nvals:
104            print errormsg
105            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
106              len(vals), ' has passed!!'
107            print gen.count_cond.__doc__
108            quit(-1)
109        vals0 = np.array(vals[0].split(cV), dtype=np.float)
110        print gen.count_cond(np.array(vals[0].split(cV), dtype=np.float),           \
111          np.float(vals[1]), vals[2])
112
113elif oper == 'datetimeStr_conversion':
114    Nvals = 3
115    vals = opts.values.split(cS)
116    if vals[0] == 'h':
117        print gen.datetimeStr_conversion.__doc__
118        quit(-1)
119    else:
120        if len(vals) != Nvals:
121            print errormsg
122            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
123              len(vals), ' has passed!!'
124            print gen.datetimeStr_conversion.__doc__
125            quit(-1)
126        print gen.datetimeStr_conversion(vals[0], vals[1], vals[2])
127
128elif oper == 'grid_combinations':
129    Nvals = 2
130    vals = opts.values.split(cS)
131    if vals[0] == 'h':
132        print gen.grid_combinations.__doc__
133        quit(-1)
134    else:
135        if len(vals) != Nvals:
136            print errormsg
137            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
138              len(vals), ' has passed!!'
139            print gen.grid_combinations.__doc__
140            quit(-1)
141
142        print gen.grid_combinations(np.int(vals[0]), np.int(vals[1]))
143
144elif oper == 'interpolate_locs':
145    Nvals = 3
146    vals = opts.values.split(cS)
147    if vals[0] == 'h':
148        print gen.interpolate_locs.__doc__
149        quit(-1)
150    else:
151        if len(vals) != Nvals:
152            print errormsg
153            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
154              len(vals), ' has passed!!'
155            print gen.interpolate_locs.__doc__
156            quit(-1)
157        vals0 = np.array(vals[0].split(cV), dtype=np.float)
158        vals1 = np.array(vals[1].split(cV), dtype=np.float)
159
160        print gen.interpolate_locs(vals0, vals1, vals[2])
161
162elif oper == 'PolyArea':
163    Nvals = 2
164    vals = opts.values.split(cS)
165    if vals[0] == 'h':
166        print gen.PolyArea.__doc__
167        quit(-1)
168    else:
169        if len(vals) != Nvals:
170            print errormsg
171            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
172              len(vals), ' has passed!!'
173            print gen.PolyArea.__doc__
174            quit(-1)
175        xvals = np.array(vals[0].split(cV), dtype=np.float)
176        yvals = np.array(vals[1].split(cV), dtype=np.float)
177
178        print gen.PolyArea(xvals, yvals)
179
180elif oper == 'radial_points':
181    Nvals = 2
182    vals = opts.values.split(cS)
183    if vals[0] == 'h':
184        print gen.radial_points.__doc__
185        quit(-1)
186    else:
187        if len(vals) != Nvals:
188            print errormsg
189            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
190              len(vals), ' has passed!!'
191            print gen.radial_points.__doc__
192            quit(-1)
193        print gen.radial_points(np.float(vals[0]), int(vals[1]))
194
195elif oper == 'radius_dist':
196    Nvals = 1
197    vals = opts.values.split(cS)
198    if vals[0] == 'h':
199        print gen.radius_dist.__doc__
200        quit(-1)
201    else:
202        if len(vals) != Nvals:
203            print errormsg
204            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
205              len(vals), ' has passed!!'
206            print gen.radius_dist.__doc__
207            quit(-1)
208        print gen.radius_dist(int(vals[0]), int(vals[1]), int(vals[2]), int(vals[2]))
209
210elif oper == 'rmNOnum':
211    Nvals = 1
212    vals = opts.values.split(cS)
213    if vals[0] == 'h':
214        print gen.rmNOnum.__doc__
215        quit(-1)
216    else:
217        if len(vals) != Nvals:
218            print errormsg
219            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
220              len(vals), ' has passed!!'
221            print gen.rmNOnum.__doc__
222            quit(-1)
223        print gen.rmNOnum(vals[0])
224
225elif oper == 'running_mean':
226    Nvals = 2
227    vals = opts.values.split(cS)
228    if vals[0] == 'h':
229        print gen.running_mean.__doc__
230        quit(-1)
231    else:
232        if len(vals) != Nvals:
233            print errormsg
234            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
235              len(vals), ' has passed!!'
236            print gen.running_mean.__doc__
237            quit(-1)
238        print gen.running_mean(np.array(vals[0].split(cV), dtype=np.float), int(vals[1]))
239
240elif oper == 'significant_decomposition':
241    Nvals = 2
242    vals = opts.values.split(cS)
243    if vals[0] == 'h':
244        print gen.significant_decomposition.__doc__
245        quit(-1)
246    else:
247        if len(vals) != Nvals:
248            print errormsg
249            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
250              len(vals), ' has passed!!'
251            print gen.significant_decomposition.__doc__
252            quit(-1)
253        print gen.significant_decomposition(np.float(vals[0]), int(vals[1]))
254
255elif oper == 'squared_radial':
256    Nvals = 1
257    vals = opts.values.split(cS)
258    if vals[0] == 'h':
259        print gen.squared_radial.__doc__
260        quit(-1)
261    else:
262        if len(vals) != Nvals:
263            print errormsg
264            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
265              len(vals), ' has passed!!'
266            print gen.squared_radial.__doc__
267            quit(-1)
268        print gen.squared_radial(int(vals[0]))
269
270elif oper == 'table_tex_file':
271    Nvals = 6
272    vals = opts.values.split(cS)
273    if vals[0] == 'h':
274        print gen.table_tex_file.__doc__
275        quit(-1)
276    else:
277        if len(vals) != Nvals:
278            print errormsg
279            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
280              len(vals), ' has passed!!'
281            print gen.table_tex_file.__doc__
282            quit(-1)
283        vals2 = np.array(vals[2].split(cV),dtype=np.float).reshape(int(vals[0]),     \
284          int(vals[1]))
285        vals3 = vals[3].replace(cE,' ').split(cV)
286        vals4 = vals[4].replace(cE,' ').split(cV)
287
288        print gen.table_tex_file(int(vals[0]), int(vals[1]), vals2, vals3, vals4,    \
289          vals[5])
290
291elif oper == 'unitsDate':
292    Nvals = 3
293    vals = opts.values.split(cS)
294    if vals[0] == 'h':
295        print gen.unitsDate.__doc__
296        quit(-1)
297    else:
298        if len(vals) != Nvals:
299            print errormsg
300            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
301              len(vals), ' has passed!!'
302            print gen.unitsDate.__doc__
303            quit(-1)
304        print gen.unitsDate(vals[0], vals[1], vals[2])
305
306elif oper == 'wdismean':
307    Nvals = 2
308    vals = opts.values.split(cS)
309    if vals[0] == 'h':
310        print gen.wdismean.__doc__
311        quit(-1)
312    else:
313        if len(vals) != Nvals:
314            print errormsg
315            print '  ' + main + ": operation '" + oper + "' requires", Nvals, 'and', \
316              len(vals), ' has passed!!'
317            print gen.wdismean.__doc__
318            quit(-1)
319        vals0 = np.array(vals[0].split(cV), dtype=np.float)
320        vals1 = np.array(vals[1].split(cV), dtype=np.float).reshape(2,2)
321
322        print gen.wdismean(vals0, vals1)
323
Note: See TracBrowser for help on using the repository browser.