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

root/raw2proc/trunk/raw2proc/ncutil.py

Revision 210 (checked in by haines, 16 years ago)

fix to proc2latest to specify len not unlimited dim

Line 
1 #!/usr/bin/env python
2 # Last modified:  Time-stamp: <2008-09-25 14:01:50 haines>
3 """
4 Create, update and load utilities for netcdf files
5 """
6
7 from pycdf import *
8 import os
9 import numpy
10
11 def nc_create(ncFile, (global_atts, var_atts, dim_inits, var_inits, var_data)):
12     """
13     Create new netcdf file
14
15     :Parameters:
16         ncFile : string
17            Path and name of file to create
18         (global_atts, var_atts, dim_inits, var_inits, var_data) : tuple
19            Global Attributes, Variable Attributes, Dimensions, Variable Dimensions, and Data
20            Everything you need to create a netCDF file.
21     """
22     try:
23         # Open new netCDF file, overwrite if it exists, create if does not
24         nc = CDF(ncFile, NC.WRITE|NC.CREATE|NC.TRUNC)
25         # Automatically set define and data modes.
26         nc.automode()
27         #
28         # GLOBALS
29         for attrName in global_atts.keys():
30             setattr(nc, attrName, global_atts[attrName])
31        
32         # DIMENSIONS
33         for dim in dim_inits:
34             dimName, dimValue = dim
35             # print '%s = %d' % (dimName, dimValue)
36             ncdim = nc.def_dim(dimName, dimValue)
37        
38         # VARIABLES
39         for var in var_inits:
40             varName, varType, varDim = var
41             ncvar = nc.def_var(varName, varType, varDim)
42             # add attributes
43             for attrName in var_atts[varName].keys():
44                 setattr(ncvar, attrName, var_atts[varName][attrName])
45             # setattr(ncvar, '_FillValue', numpy.nan)
46            
47         # add data
48         nrecs = nc.inq_unlimlen()
49         for var in var_data:
50             varName, varData = var
51             # print varName
52             ncvar = nc.var(varName)
53             # e.g. lat = array(var_data['lat'])
54             # if an array
55             if type(varData) == numpy.ndarray:
56                 if ncvar.isrecord():
57                     # time, ens, u, v
58                     ncvar[nrecs:nrecs+len(varData)] = varData.tolist()
59                 else:
60                     ncvar[:] = varData.tolist() # z
61             else:
62                 # if tuple, sequence or scalar
63                 ncvar[:] = varData
64        
65         nc.close()
66     except CDFError, msg:
67         print "CDFError:", msg
68         # if nc:
69         #     nc.close()
70         #     del(nc)
71
72 def nc_update(ncFile, (global_atts, var_atts, var_data)):
73     """
74     Create new netcdf file
75
76     :Parameters:
77         ncFile : string
78           Path and name of file to create
79         (global_atts, var_atts, var_data) : tuple
80           Global Attributes, Variable Attributes and Data
81           Everything you need to update a netCDF file.
82     """
83     try:
84         # Open netCDF in write mode
85         nc = CDF(ncFile, NC.WRITE)
86         # Automatically set define and data modes.
87         nc.automode()
88         #
89         # GLOBALS
90         for attrName in global_atts.keys():
91             setattr(nc, attrName, global_atts[attrName])
92        
93         # VARIABLES
94         # update attributes
95         for var in var_atts:
96             varName, atts = var
97             ncvar = nc.var(varName)
98             for attrName in atts.keys():
99                 setattr(ncvar, attrName, atts[attrName])
100            
101         # update data
102         nrecs = nc.inq_unlimlen()
103         for var in var_data:
104             varName, varData = var
105             ncvar = nc.var(varName)
106             # e.g. lat = array(var_data['lat'])
107             # if an array
108             if type(varData) == numpy.ndarray:
109                 if ncvar.isrecord():
110                     # time, ens, u, v (with unlimited dimension)
111                     ncvar[nrecs:nrecs+len(varData)] = varData.tolist()
112                 else:
113                     ncvar[:] = varData.tolist() # z (limited dimension)
114             else:
115                 # if tuple, sequence or scalar
116                 ncvar[:] = varData
117
118         nc.close()
119     except CDFError, msg:
120         print "CDFError:", msg
121         # if nc:
122         #     nc.close()
123         #     del(nc)
124
125 def nc_get_time(ncFile):
126     """get time array from file """
127     try:
128         nc = CDF(ncFile)
129         ncvars = nc.variables()
130         if 'time' in ncvars.keys():
131             es = nc.var('time')[:]
132             units = nc.var('time').units
133         else:
134             print "time variable not found in ", ncFile
135         nc.close()
136         return (es, units)
137     except CDFError, msg:
138         print "CDFError:", msg
139
140                    
141 def nc_find_record_vars(ncFile):
142     """find which variable are record variables"""
143     try:
144         nc = CDF(ncFile)
145         ncvars = nc.variables()
146         # list which variables is a record variable
147         var_list = [varName for varName in ncvars.keys() if nc.var(varName).isrecord()]
148         nc.close()
149         return var_list
150     except CDFError, msg:
151         print "CDFError:", msg
152                    
153
154 def nc_load(ncFile, varsLoad='all', nameType='variable_name',
155             ga_flag=True, va_flag=True):
156     """
157     Load netcdf file
158
159     :Parameters:
160         ncFile : string
161             Path and name of file to load
162
163     :Other Parameters:
164         nameType : string 'variable_name' (default) or 'standard_name'
165             Defines naming convention to use for variable names as data
166             are loaded.  Variable name is the name used to store data
167             in file.  'standard_name' means use variable name based on
168             variable attribute called 'standard_name' of netcdf variable.
169         varLoad : string or tuple of strings
170             specific variable names to be loaded into a sequence or scalar
171             in python following specification set in nameType
172             By default, all variables will be loaded.
173         ga_flag : boolean flag
174             By default, load the global file attributes
175         va_flag : boolean flag
176             By default, load the variable file attributes
177            
178     :Returns:
179         (global_atts, var_atts, dim_inits, var_inits, var_data) : tuple
180           Global Attributes, Variable Attributes, Dimensions, Variable Dimensions, and Variable Data
181           Everything you need to create a netCDF file.
182
183     """
184     try:
185         nc = CDF(ncFile, NC.NOWRITE)
186
187         ncdims = nc.dimensions(full=1)
188         ncvars = nc.variables()
189
190         # GLOBAL ATTRIBUTES (global_atts)
191         if ga_flag:
192             global_atts = nc.attributes()
193         else:
194             global_atts = {}
195
196         # DIMENSIONS (dim_inits)
197         dim_inits = [None for j in range(len(ncdims))]
198         if len(ncdims)>0:
199             for dimName,dimValue in ncdims.items():
200                 val,idx,isUN = dimValue
201                 if isUN:
202                     dim_inits[idx] = (dimName, NC.UNLIMITED)
203                 else:
204                     dim_inits[idx] = (dimName, val)
205
206         if varsLoad == 'all':
207             varNames = ncvars.keys()
208         else:
209             varNames = varsLoad
210
211         # VARIABLE DIMENSIONS (var_inits)
212         # gets init info for requested variables and original order
213
214         # initialize with same number of original variables
215         # so order can be preserved by idx
216         var_inits = [None for j in range(len(ncvars))]
217         if len(ncvars)>0:
218             for varName in varNames:
219                     val,shape,typ,idx = ncvars[varName]
220                     var_inits[idx] = (varName, typ, val)
221
222         # remove the None values from the list to preserve original order
223         var_inits = [v for v in var_inits if v != None]
224        
225         # VARIABLE ATTRIBUTES (var_atts)
226         # gets attributes of requested variables
227         var_atts = {}
228         if len(ncvars)>0 and va_flag:
229             for var in varNames:
230                 varAttrs = nc.var(var).attributes()
231                 var_atts[var] = varAttrs
232
233         # VARIABLE DATA (var_data)
234         # loads requested variables, original order preserved as with var_inits
235         var_data = [None for j in range(len(ncvars))]
236         if len(ncvars)>0:
237             for varName in varNames:
238                 val,shape,typ,idx = ncvars[varName]
239                 var_data[idx] = (varName, nc.var(varName)[:])
240
241         var_data = [v for v in var_data if v != None]
242
243         # type cast lists into tuples
244         dim_inits = tuple(dim_inits)
245         var_inits = tuple(var_inits)
246         var_data = tuple(var_data)
247
248         nc.close()
249         return (global_atts, var_atts, dim_inits, var_inits, var_data)
250        
251     except CDFError, msg:
252         print "CDFError:", msg
253
254        
Note: See TracBrowser for help on using the browser.