source: nappy/trunk/naToCdms.py @ 343

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/nappy/trunk/naToCdms.py@343
Revision 343, 6.4 KB checked in by astephen, 15 years ago (diff)

Latest version with new files in test directory.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1"""
2naToCdms.py
3===========
4
5Container module for mixin class NAToCdms that is sub-classed
6by NAFile classes.
7
8"""
9
10# Imports from python standard library
11import sys
12sys.path.append(r"..")
13import os
14import re
15import time
16
17# Import from nappy package
18import cdmsMap
19from naError import *
20
21# Import external packages (if available)
22if sys.platform.find("win")>-1:
23    pass
24else:
25    try:
26        import cdms, Numeric 
27    except:
28        print "Cannot import cdms package, CDAT-dependent features will not work."
29
30# Define global variables
31safe_nc_id=re.compile("[\s\[\(\)\]\=\+\-\?\#\~\@\&\$\%\£\!\*\{\}]+")
32
33class NAToCdms:
34
35    def toCdmsFile(self, filename, variables="all", aux_variable="all", global_attributes={"Conventions":"CF-1.0"}, ffi=None):
36        if sys.platform.find("win")>-1:
37            raise NAPlatformError
38
39        self.cdmsFilename=filename
40        self.cdmsFile=cdms.open(self.cdmsFilename, 'w')
41       
42        # at file level: write global attributes
43        for key in global_attributes.keys():
44            setattr(self.cdmsFile, key, global_attributes[key])
45
46        for key in cdmsMap.cdmsMap["fromNA"].keys():
47            if type(key)==tuple:
48                if key==("SCOM", "NCOM"):
49                    commentline="NASA Ames Special Comments:\n"
50                    for i in self.SCOM: commentline=commentline+"\n"+i
51                    commentline=commentline+"NASA Ames Normal Comments:\n"
52                    for i in self.NCOM: commentline=commentline+"\n"+i
53                    self.cdmsFile.comment=commentline
54                else:
55                    item=(getattr(self, key[0]))+"\n"+(getattr(self, key[1]))
56                    setattr(self.cdmsFile, cdmsMap.cdmsMap["fromNA"][key], item)
57            elif key=="RDATE":
58                dateparts=getattr(self, "RDATE")
59                datestring="%.4d-%.2d-%.2d" % tuple(dateparts)
60                item=datestring+" - NASA Ames File created/revised.\n"
61                timestring=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
62                item=item+"\n"+timestring+" - Data written to NetCDF file."
63            else:
64                setattr(self.cdmsFile, cdmsMap.cdmsMap["fromNA"][key], getattr(self, key))
65
66        # Then do dimensions
67        if not hasattr(self, 'cdmsAxes'):  self.createCdmsAxes()
68
69        # Then do variables
70        if not hasattr(self, 'cdmsVariables'):  self.createCdmsVariables()
71        for var in self.cdmsVariables:
72            self.cdmsFile.write(var)
73
74        # Then do auxiliary variables
75        if hasattr(self, "NAUXV") and type(self.NAUXV)==int:   # Are there any auxiliary variables?
76            if not hasattr(self, 'cdmsAuxVariables'):  self.createCdmsAuxVariables()
77            for avar in self.cdmsAuxVariables:
78                self.cdmsFile.write(avar)
79
80        self.cdmsFile.close()
81        return "Cdmsfile '%s' written successfully." % self.cdmsFilename
82
83    def createCdmsVariables(self):
84        self.cdmsVariables=[]
85        for var_number in range(self.NV):
86            self.cdmsVariables.append(self.toCdmsVariable(var_number))
87
88
89    def toCdmsVariable(self, var_number, attributes={}):
90        if sys.platform.find("win")>-1:
91            raise NAPlatformError
92        (varname, units, miss, scal)=self.getVariable(var_number)
93
94        array=Numeric.array(self.V[var_number])
95        array=array*scal
96        # Set up axes
97        if not hasattr(self, 'cdmsAxes'):
98            self.createCdmsAxes()
99
100        # Set up variable
101        var=cdms.createVariable(array, axes=self.cdmsAxes, fill_value=miss, attributes=attributes)
102
103        # Sort units etc
104        if units:   var.units=units
105        if len(varname)<20:
106            var.id=safe_nc_id.sub("_", varname).lower()
107        else:
108            var.id="naVariable_%s" % (var_number)
109
110        var.long_name=var.name=varname
111        if varname in ("standard_name_list",) or varname in ("badc_list",):
112            var.standard_name="name from the list*****"
113
114        return var
115
116    def createCdmsAuxVariables(self):
117        self.cdmsAuxVariables=[]
118        for avar_number in range(self.NAUXV):
119            self.cdmsAuxVariables.append(self.auxToCdmsVariable(avar_number))
120
121    def auxToCdmsVariable(self, avar_number, attributes={}):
122        if sys.platform.find("win")>-1:
123            raise NAPlatformError
124        (varname, units, miss, scal)=self.getAuxVariable(avar_number)
125        array=Numeric.array(self.A[avar_number])
126        array=array*scal
127
128        # Set up axes
129        if not hasattr(self, 'cdmsAxes'):
130            self.createCdmsAxes()
131
132        # Set up variable
133        var=cdms.createVariable(array, axes=[self.cdmsAxes[0]], fill_value=miss, attributes=attributes)
134
135        # Sort units etc
136        if units:   var.units=units
137        if len(varname)<20:
138            var.id=safe_nc_id.sub("_", varname).lower()
139        else:
140            var.id="naAuxVariable_%s" % (avar_number)
141
142        var.long_name=var.name=varname
143        if varname in ("standard_name_list",) or varname in ("badc_list",):
144            var.standard_name="name from the list*****"
145
146        return var       
147
148    def createCdmsAxes(self):
149        if sys.platform.find("win")>-1:
150            raise NAPlatformError
151        if not hasattr(self, 'cdmsAxes'):       
152            self.cdmsAxes=[]
153        for ivar_number in range(self.NIV):
154            self.cdmsAxes.append(self.toCdmsAxis(ivar_number))
155
156    def toCdmsAxis(self, ivar_number):
157        if sys.platform.find("win")>-1:
158            raise NAPlatformError
159
160        if self._normalizedX=="no": self._normalizeIndVars()
161
162        if self.NIV==1:
163            array=self.X
164        else:
165            array=self.X[ivar_number]
166        axis=cdms.createAxis(array)
167        axis.id=axis.name=axis.long_name=self.XNAME[ivar_number]
168        (varname, units)=self.getIndependentVariable(ivar_number)
169        # Sort units etc
170        if units:   axis.units=units
171        if len(varname)<20:
172            axis.id=safe_nc_id.sub("_", varname).lower()
173        else:
174            axis.id="naAuxVariable_%s" % (ivar_number)
175
176        if units: axis.units=units
177        axis_types=("longitude", "latitude", "level", "time")
178        designators={"longitude":axis.designateLongitude, "latitude":axis.designateLatitude,
179                     "level":axis.designateLevel, "time":axis.designateTime}
180        for axis_type in axis_types:
181            if re.search(axis_type, varname, re.IGNORECASE):
182                axis.standard_name=axis.id=axis_type
183                apply(designators[axis_type.lower()])
184        return axis
185
Note: See TracBrowser for help on using the repository browser.