source: TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py @ 3051

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py@3051
Revision 3051, 5.7 KB checked in by domlowe, 12 years ago (diff)

removing print

Line 
1import cdms,MV
2import Numeric
3import csml
4import sys
5
6class NCwriter(object):
7    #This provides a simplified wrapper to CDMS to write a CF compliant NetCDF
8    def __init__(self, fileName):
9        #initiates a new NetCDF file
10        self.nc=cdms.open(fileName,'w')
11   
12    def setGlobalAttributes(self, **kwargs):
13        #sets global attributes
14        pass
15   
16    def addAxis(self,axisName, data,isLon=None,isLat=None,isTime=None,**kwargs):
17        #first ensure tuple does not contains a list
18        if type(data[0]) is list:
19            newdata=tuple(data[0])
20            data=newdata
21           
22        # Now create the axis   
23        dataarray=MV.array(data)
24        ax=cdms.createAxis(dataarray)
25        ax.id = axisName
26        if not hasattr(self,'axes'):
27            self.axes=[]
28        if isLon is not None:
29            ax.designateLongitude()
30            setattr(ax, 'standard_name', 'longitude')
31        elif isLat is not None:
32            ax.designateLatitude()
33            setattr(ax, 'standard_name', 'latitude')
34        elif isTime is not None:
35            ax.designateTime()
36            setattr(ax, 'standard_name', 'time')
37        for key in kwargs:
38            setattr(ax, key,kwargs[key])
39        self.axes.append(ax)
40       
41   
42    def getAxis(self, axID):
43        for axis in self.axes:
44            if axis.id == axID:
45                return axis
46   
47   
48   
49    def addTimeVariable(self,timeval): 
50        dataarray=MV.array(timeval)
51        #dataarray.id='time'
52        #dataarray.name ='time'
53        ax=self.getAxis('time')
54        dataarray.setAxis(0,ax)           
55        self.nc.write(dataarray)
56       
57       
58    def addVariable(self,data, variableName,axesList, fillvalue, stdname=None, **kwargs):       
59        #creates a new variable containing data with named attributes from **kwargs       
60             
61        dataarray=MV.array(data)     
62        dataarray.id=variableName
63        dataarray.name=variableName
64        for key in kwargs:
65            setattr(dataarray, key,kwargs[key])
66        axisCount=0
67     
68        #depending on whether time is modelled in the underlying data as a dimension or not the shapes may not match
69        if len(dataarray.shape) < len(axesList): 
70            #take time out and create a separate variable
71            newaxesList=[]
72            for a in axesList:
73                if a != 'time':
74                    newaxesList.append(a)
75            axesList=newaxesList
76        if hasattr(self, 'axes'):   
77            for axis in axesList:
78                for ax in self.axes:
79                    if ax.id == axis:
80                        dataarray.setAxis(axisCount,ax)                       
81                        axisCount = axisCount +1     
82        #missing_value deprecated but in common use;
83        #setattr(dataarray, 'missing_value' ,fillvalue)
84        setattr(dataarray, '_FillValue' ,fillvalue)
85        if stdname:
86            setattr(dataarray, 'standard_name' ,stdname)
87        self.nc.write(dataarray)
88
89    def genWriteVar(self,varid, ordinates, times, caltype, axisorder, unitlist, stdname, fulldata, fillvalue, **kwargs):
90
91        #**kwargs may contain additional axes not contained in a GridCoordinatesTable - e.g latitude, longitude may be stored in other attribute not in the rectified grid.     
92        axesdone=[]
93        floatTimes=[]
94        #determine base units for times:
95        tOne=csml.csmllibs.csmltime.getCDtime(times[0])
96        tbase=csml.csmllibs.csmltime.getBaseUnits(tOne)
97        for time in times:
98            time=csml.csmllibs.csmltime.getCDtime(time).torel(tbase)
99            floatTimes.append(time.value)
100        self.addAxis('time',floatTimes,isTime=1,units=tbase,calendar=caltype)
101 
102        axesdone.append('time')
103        if ordinates is not None:
104            for ord in enumerate(ordinates):
105                vals=[]
106                lon,lat=None,None
107                if ord[1].coordAxisLabel.CONTENT=='time':
108                    continue
109                else:
110                    for val in ord[1].coordAxisValues.coordinateList.CONTENT.split():
111                        if val != ' ':
112                            vals.append(eval(val)) 
113                if ord[1].coordAxisLabel.CONTENT=='longitude':
114                    lon=1
115                    name='longitude'
116                elif ord[1].coordAxisLabel.CONTENT=='latitude':
117                    lat=1
118                    name='latitude'
119                else:
120                    name=ord[1].coordAxisLabel.CONTENT
121                for ax in enumerate(axisorder):
122                    if ax[1]==name:
123                        position=ax[0]
124                axesdone.append(name)
125                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])#to do, units attribute for CF compliance
126       
127        if kwargs is not None:   
128            for kw in kwargs:
129                lon,lat=None,None
130                if kw=='longitude':
131                    lon=1
132                elif kw == 'latitude':
133                    lat=1
134                name = kw
135                for ax in enumerate(axisorder):
136                    if ax[1]==name:
137                        position=ax[0]
138                vals=(kwargs[kw],)
139                self.addAxis(name,vals,isLon=lon,isLat=lat,units=unitlist[position])
140                axesdone.append(name)       
141        self.addVariable(fulldata,varid, axisorder, fillvalue, units=unitlist[-1], stdname=stdname ) 
142
143        #for ax in self.axes: #don't think this is needed!
144            #if ax.id =='time':
145                #if self.nc.variables.has_key('time') is False:
146                    #self.addTimeVariable(floatTimes)
147       
148       
149    def closeFinishedFile(self):
150        #returns finished (hopefully) NetCDF file
151        self.nc.close()
Note: See TracBrowser for help on using the repository browser.