NCCOOS Trac Projects: Top | Web | Platforms | Processing | Viz | Sprints | Sandbox | (Wind)

root/raw2proc/trunk/raw2proc/proc_mini_andi_turbidity.py

Revision 375 (checked in by cbc, 14 years ago)

Process and config modules for Spongenet.

Line 
1 """
2 Parse data and assert what data creates and updates monthly NetCDF files.
3
4 Spongenet mini_andi turbidity parameters sponge data.
5 """
6
7 import math
8 import numpy as n
9 import pycdf
10 import datetime
11 import procutil
12 from spongenet.parse import Data
13
14 nowDt = datetime.datetime.utcnow().replace(microsecond=0)
15
16 def parser(platform_info, sensor_info, lines):
17     """
18     Parse and assign sponge data from XML file.
19     """
20    
21     _data = Data(''.join(lines))
22    
23     # Each Device tag represents a time sample.
24     num_samples = len(_data.devices)
25    
26     data = {
27         'dt'        : n.array(n.ones((num_samples,)) * n.nan, dtype=object),
28         'time'      : n.array(n.ones((num_samples,)) * n.nan, dtype=long),
29         'pdt'       : n.array(n.ones((num_samples,)) * n.nan, dtype=object),
30         'ptime'     : n.array(n.ones((num_samples,)) * n.nan, dtype=long),
31         'ds'        : n.array(n.ones((num_samples,)) * n.nan, dtype=object),
32         'session'   : n.array(n.ones((num_samples,)) * n.nan, dtype=long),
33         'pds'       : n.array(n.ones((num_samples,)) * n.nan, dtype=object),
34         'psession'  : n.array(n.ones((num_samples,)) * n.nan, dtype=long),
35         'record'    : n.array(n.ones((num_samples,)) * n.nan, dtype=int),
36         'status'    : n.array(n.ones((num_samples,)) * n.nan, dtype=int),
37         'pstatus'   : n.array(n.ones((num_samples,)) * n.nan, dtype=int),
38         'turbidity' : n.array(n.ones((num_samples,)) * n.nan, dtype=float),
39            }
40    
41     for (sample_index, sample) in enumerate(_data.devices):
42         # sample time at the platform
43         dt = {'month' : int(sample['time'][5:7]),
44               'day'   : int(sample['time'][8:10]),
45               'year'  : int(sample['time'][0:4]),
46               'hour'  : int(sample['time'][11:13]),
47               'min'   : int(sample['time'][14:16]),
48               'sec'   : int(sample['time'][17:19]),
49              }
50         dt = '%(month)02d-%(day)02d-%(year)04d %(hour)02d:%(min)02d:%(sec)02d' \
51              % dt
52         dt = procutil.scanf_datetime(dt, fmt='%m-%d-%Y %H:%M:%S')
53         if sensor_info['utc_offset']:
54             dt = dt + datetime.timedelta(hours=sensor_info['utc_offset'])
55         data['dt'][sample_index] = dt       
56         data['time'][sample_index] = procutil.dt2es(dt)
57
58         # sample time at the package
59         package_dt = {'month' : int(sample['data_time'][5:7]),
60                       'day'   : int(sample['data_time'][8:10]),
61                       'year'  : int(sample['data_time'][0:4]),
62                       'hour'  : int(sample['data_time'][11:13]),
63                       'min'   : int(sample['data_time'][14:16]),
64                       'sec'   : int(sample['data_time'][17:19]),
65                      }
66         package_dt = ('%(month)02d-%(day)02d-%(year)04d ' +
67                       '%(hour)02d:%(min)02d:%(sec)02d') \
68                      % package_dt
69         package_dt = procutil.scanf_datetime(package_dt, fmt='%m-%d-%Y %H:%M:%S')
70         if sensor_info['utc_offset']:
71             package_dt = package_dt + \
72                         datetime.timedelta(hours=sensor_info['utc_offset'])
73         data['pdt'][sample_index] = package_dt
74         data['ptime'][sample_index] = procutil.dt2es(package_dt)
75
76         # platform session time
77         ds = {'month' : int(sample['sessionid'][14:16]),
78               'day'   : int(sample['sessionid'][17:19]),
79               'year'  : int(sample['sessionid'][9:13]),
80               'hour'  : int(sample['sessionid'][20:22]),
81               'min'   : int(sample['sessionid'][23:25]),
82               'sec'   : int(sample['sessionid'][26:28]),
83              }
84         ds = '%(month)02d-%(day)02d-%(year)04d %(hour)02d:%(min)02d:%(sec)02d' \
85              % ds
86         ds = procutil.scanf_datetime(ds, fmt='%m-%d-%Y %H:%M:%S')
87         if sensor_info['utc_offset']:
88             ds = ds + datetime.timedelta(hours=sensor_info['utc_offset'])
89         data['ds'][sample_index] = ds       
90         data['session'][sample_index] = procutil.dt2es(ds)
91
92         # package session time
93         package_ds = {'month' : int(sample['data_sessionid'][5:7]),
94                       'day'   : int(sample['data_sessionid'][8:10]),
95                       'year'  : int(sample['data_sessionid'][0:4]),
96                       'hour'  : int(sample['data_sessionid'][11:13]),
97                       'min'   : int(sample['data_sessionid'][14:16]),
98                       'sec'   : int(sample['data_sessionid'][17:19]),
99                      }
100         package_ds = ('%(month)02d-%(day)02d-%(year)04d ' +
101                       '%(hour)02d:%(min)02d:%(sec)02d') \
102                      % package_ds
103         package_ds = procutil.scanf_datetime(package_ds, fmt='%m-%d-%Y %H:%M:%S')
104         if sensor_info['utc_offset']:
105             package_ds = package_ds + \
106                         datetime.timedelta(hours=sensor_info['utc_offset'])
107         data['pds'][sample_index] = package_ds
108         data['psession'][sample_index] = procutil.dt2es(package_ds)
109
110         # platform variables
111         try:
112             data['record'][sample_index] = int(sample["recordnumber"])
113         except KeyError:
114             pass
115
116         try:
117             data['status'][sample_index] = int(sample["status"].
118                                                partition(":")[0])
119         except (KeyError, AttributeError, ):
120             pass
121
122         # package variables
123         try:
124             data['pstatus'][sample_index] = int(sample.sensors
125                                                 [sensor_info["id_number"]]
126                                                 ["status"].
127                                                 partition(":")[0])
128         except (KeyError, AttributeError, ):
129             pass
130
131         try:
132             data['turbidity'][sample_index] = float(sample.sensors
133                                                     [sensor_info["id_number"]].
134                                                     points[sensor_info
135                                                     ["turbidity_description"]]
136                                                     ["value"])
137         except (KeyError, AttributeError, ):
138             pass
139
140     return data
141
142 def creator(platform_info, sensor_info, data):
143     #
144     #
145     title_str = sensor_info['description']+' at '+ sensor_info['location']
146     global_atts = {
147         # Required
148         'title' : title_str,
149         'institution' : platform_info['institution'],
150         'institution_url' : platform_info['institution_url'],
151         'institution_dods_url' : platform_info['institution_dods_url'],
152         'contact' : platform_info['contact'],
153         'Conventions' : platform_info['conventions'],
154         # Required by Scout
155         'format_category_code' : platform_info['format_category_code'],
156         'institution_code' : platform_info['institution_code'],
157         'platform_code' : platform_info['id'],
158         'package_code' : sensor_info['id'],
159         # Required by Version tracking
160         'format' : platform_info['format'],
161         'seacoos_rt_version' : platform_info['seacoos_rt_version'],
162         # Recommended
163         '_FillValue' : n.nan,
164         'missing_value' : n.nan,
165         'source' : platform_info['source'],
166         'references' : platform_info['references'],
167         'metadata_url' : platform_info['metadata_url'],
168         'history' : 'raw2proc using ' + sensor_info['process_module'],
169         'comment' : 'File created using pycdf ' + \
170                     pycdf.pycdfVersion() + ' and ' + \
171                     pycdf.pycdfArrayPkg() + ' ' + \
172                     n.__version__,
173         'project' : platform_info['project'],
174         'project_url' : platform_info['project_url'],
175         # timeframe of data contained in file yyyy-mm-dd HH:MM:SS
176         # first date in monthly file
177         'start_date' : data['dt'][0].strftime("%Y-%m-%d %H:%M:%S"),
178         # last date in monthly file
179         'end_date' : data['dt'][-1].strftime("%Y-%m-%d %H:%M:%S"),
180         'release_date' : nowDt.strftime("%Y-%m-%d %H:%M:%S"),
181         'creation_date' : nowDt.strftime("%Y-%m-%d %H:%M:%S"),
182         'modification_date' : nowDt.strftime("%Y-%m-%d %H:%M:%S"),
183         'process_level' : 'level1',
184         # Custom
185         'id_number' : platform_info['id_number'],
186         'description' : platform_info['description'],
187         'serial_number' : platform_info['serial_number'],
188         'product_number' : platform_info['product_number'],
189         'product_name' : platform_info['product_name'],
190         'type' : platform_info['type'],
191         'protocol_version' : platform_info['protocol_version'],
192         'xmlns' : platform_info['xmlns'],
193         'location' : platform_info['location'],
194         'vertical_position': platform_info['vertical_position'],
195         'owner' : platform_info['owner'],
196         'package_id_number' : sensor_info['id_number'],
197         'package_description' : sensor_info['description'],
198         'package_serial_number' : sensor_info['serial_number'],
199         'package_product_number' : sensor_info['product_number'],
200         'package_product_name' : sensor_info['product_name'],
201         'package_adr' : sensor_info['adr'],
202         'package_protocol_version' : sensor_info['protocol_version'],
203         'package_vertical_position' : sensor_info['vertical_position'],
204         }
205    
206     var_atts = {
207         # coordinate variables
208         'time' : {'short_name': 'time',
209                   'long_name': 'Time',
210                   'standard_name': 'time',
211                   'units': 'seconds since 1970-1-1 00:00:00 -0', # UTC
212                   'axis': 'T',
213                  },
214         'lat' : {'short_name': 'lat',
215                  'long_name': 'Latitude',
216                  'standard_name': 'latitude',
217                  'reference':'geographic coordinates',
218                  'units': 'degrees_north',
219                  'valid_range':(-90.,90.),
220                  'axis': 'Y',
221                 },
222         'lon' : {'short_name': 'lon',
223                  'long_name': 'Longtitude',
224                  'standard_name': 'longtitude',
225                  'reference':'geographic coordinates',
226                  'units': 'degrees_east',
227                  'valid_range':(-180.,180.),
228                  'axis': 'Y',
229                 },
230         'z' : {'short_name': 'z',
231                'long_name': 'Height',
232                'standard_name': 'height',
233                'reference':'zero at sea-surface',
234                'positive' : 'up',
235                'units': 'meters',
236                'axis': 'Z',
237               },
238         # data variables
239         'ptime' : {'short_name': 'ptime',
240                    'long_name': 'Package Time',
241                    'standard_name': 'none',
242                    'units': 'seconds since 1970-1-1 00:00:00 -0', # UTC
243                  },
244         'session' : {'short_name': 'session',
245                      'long_name': 'Session ID',
246                      'standard_name': 'none',
247                      'units': 'seconds since 1970-1-1 00:00:00 -0', # UTC
248                  },
249         'psession' : {'short_name': 'ptime',
250                       'long_name': 'Package Session ID',
251                       'standard_name': 'none',
252                       'units': 'seconds since 1970-1-1 00:00:00 -0', # UTC
253                  },
254         'record' : {'short_name': 'record',
255                     'long_name': 'Record Number',
256                     'standard_name': 'none',
257                     'units' : 'none',
258                  },
259         'status': {'short_name' : 'status',
260                    'long_name': 'Platform Status Code',
261                    'standard_name': 'none',
262                    'units' : 'none',
263                    'value_map' : platform_info['status_map'],
264                   },
265         'pstatus': {'short_name' : 'pstatus',
266                     'long_name': 'Package Status Code',
267                     'standard_name': 'none',
268                     'units' : 'none',
269                     'value_map' : sensor_info['status_map'],
270                   },
271         'turbidity' : {'short_name' : 'turbidity',
272                        'long_name': sensor_info['turbidity_description'],
273                        'standard_name': 'turbidity',
274                        'units': 'none',
275                        'id_number' : sensor_info['turbidity_id'],
276                        'type' : sensor_info['turbidity_type'],
277                        'format' : sensor_info['turbidity_format'],
278                        'non_standard_units' : sensor_info['turbidity_units'],
279                        'range_min' : sensor_info['turbidity_range_min'],
280                        'range_max' : sensor_info['turbidity_range_max'],
281                    },
282         }
283    
284     # dimension names use tuple so order of initialization is maintained
285     dim_inits = (
286         ('ntime', pycdf.NC.UNLIMITED),
287         ('nlat', 1),
288         ('nlon', 1),
289         ('nz', 1),
290         )
291    
292     # using tuple of tuples so order of initialization is maintained
293     # using dict for attributes order of init not important
294     # use dimension names not values
295     # (varName, varType, (dimName1, [dimName2], ...))
296     var_inits = (
297         # coordinate variables
298         ('time',  pycdf.NC.INT,   ('ntime',)),
299         ('lat',   pycdf.NC.FLOAT, ('nlat',)),
300         ('lon',   pycdf.NC.FLOAT, ('nlon',)),
301         ('z',     pycdf.NC.FLOAT, ('nz',)),
302         # data variables
303         ('ptime',     pycdf.NC.INT, ('ntime',)),
304         ('session',   pycdf.NC.INT, ('ntime',)),
305         ('psession',  pycdf.NC.INT, ('ntime',)),
306         ('record',    pycdf.NC.INT, ('ntime',)),
307         ('status',    pycdf.NC.INT, ('ntime',)),
308         ('pstatus',   pycdf.NC.INT, ('ntime',)),
309         ('turbidity', pycdf.NC.FLOAT, ('ntime',)),
310                 )
311    
312     # subset data only to month being processed (see raw2proc.process())
313     i = data['in']
314    
315     # var data
316     var_data = (
317         ('time',      data['time'][i]),
318         ('lat',       sensor_info['lat']),
319         ('lon',       sensor_info['lat']),
320         ('z',         sensor_info['elevation']),
321         ('ptime',     data['ptime'][i]),
322         ('session',   data['session'][i]),
323         ('psession',  data['psession'][i]),
324         ('record',    data['record'][i]),
325         ('status',    data['status'][i]),
326         ('pstatus',   data['pstatus'][i]),
327         ('turbidity', data['turbidity'][i]),
328         )
329    
330     return (global_atts, var_atts, dim_inits, var_inits, var_data)
331
332 def updater(platform_info, sensor_info, data):
333     #
334     global_atts = {
335         # update times of data contained in file (yyyy-mm-dd HH:MM:SS)
336         # last date in monthly file
337         'end_date' : data['dt'][-1].strftime("%Y-%m-%d %H:%M:%S"),
338         'release_date' : nowDt.strftime("%Y-%m-%d %H:%M:%S"),
339         #
340         'modification_date' : nowDt.strftime("%Y-%m-%d %H:%M:%S"),
341         }
342    
343     # data variables
344     # update any variable attributes like range, min, max
345     var_atts = {}
346    
347     # subset data only to month being processed (see raw2proc.process())
348     i = data['in']
349    
350     # data
351     var_data = (
352         ('time',      data['time'][i]),
353         ('ptime',     data['ptime'][i]),
354         ('session',   data['session'][i]),
355         ('psession',  data['psession'][i]),
356         ('record',    data['record'][i]),
357         ('status',    data['status'][i]),
358         ('pstatus',   data['pstatus'][i]),
359         ('turbidity', data['turbidity'][i]),
360         )
361    
362     return (global_atts, var_atts, var_data)
363
Note: See TracBrowser for help on using the browser.