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

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

time variable now added to netcdf file

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