source: TI03-DataExtractor/branches/old_stuff/dx-0.1.0/datasetdb.py @ 793

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/branches/old_stuff/dx-0.1.0/datasetdb.py@793
Revision 793, 6.5 KB checked in by astephen, 13 years ago (diff)

Put all the old code in the old_stuff branch.

Line 
1"""
2datasets.py
3===========
4
5Datasets module for the extractor package.
6
7This module holds the Datasetdb class that is used
8to hold and access information about datasets visible
9to the extractor package.
10
11Version history
12===============
13
14Version 1.0:  - 01/03/2004
15              - Ag Stephens, British Atmospheric Data Centre.
16              - First version.
17
18"""
19
20# Import required modules
21import shelve
22import os
23import cdtime
24import cdms
25import re
26
27# Import global variables
28from shared_data import *
29from config import *
30
31class Datasetdb:
32 
33    def __init__(self):
34        self.file=None
35        self.datasetURI=None
36   
37    def copyDict(self):
38        return self.dict
39
40    def _openCdmsFile(self):
41        if self.datasetURI:
42            cdmlfile=self.datasetURI
43        else:
44            for item in subsets[self.dataset]:
45                if item[0]==self.subset:
46                    cdmlfile=item[1]
47        self.file=cdms.open(cdmlfile)
48
49    def _getVariable(self):
50        try:
51            varname=re.match(".+\[\s*(\w+)\s*\]", self.variable).group(1)
52        except:
53            raise "Cannot match the pattern for the variables %s " % self.variable
54        try:
55            rtvalue=self.file[varname]
56        except:
57            raise "Cannot find variable %s in file %s" % (varname, self.file.id)
58        return rtvalue
59
60    def getSubsetURIList(self):
61        rtlist=[]
62        for dset in subsets.keys():
63            for subset in subsets[dset]:
64                URI_sub_dset=(subset[1], subset[0], dset)
65                rtlist.append(URI_sub_dset)
66        return rtlist
67
68    def getDatasetFromURI(self, datasetURI):
69        URI_list=self.getSubsetURIList()
70        for URI in URI_list:
71            if URI[0]==datasetURI:
72                return URI[2]
73        return None
74
75    def getProtectID(dataset=None, datasetURI=None):
76        if not dataset and not datasetURI:
77            raise "You must provide either dataset ID or dataset URI as argument."
78        if datasetURI:
79            dataset=self.getDatasetFromURI(datasetURI)         
80        protect_id=datasets[dataset]
81        return protect_id
82
83    def getDatasets(self):
84        return datasets
85
86    def getSubsets(self, dataset):
87        self.datasets=datasets
88        return subsets[dataset]
89
90    def getVariables(self, dataset=None, subset=None, datasetURI=None):
91        (self.dataset, self.subset, self.datasetURI)=(dataset, subset, datasetURI)
92        self._openCdmsFile()
93        vars=self.file.variables
94        rtvars=[]
95        vcount=0
96        for var in vars:
97           v=self.file[var]
98           if not hasattr(v, "title"): 
99               if not hasattr(v, "name"):
100                   if not hasattr(v, "standard_name"):
101                       if hasattr(v, "id"):
102                           name=v.id
103                       else:
104                           vcount=vcount+1
105                           name="unnamed_var_%s" % vcount
106                   else:
107                       name=v.standard_name
108               else:
109                   name=v.name
110           else:
111               name=v.title
112           # Fix name to remove leading asterisks and lower case surface start.
113           name=name.replace("_", " ")
114           if name[:2]=="**": name=(name[2:]).strip()
115           if name[:7]=="surface": name=(name[7:]).strip()
116           # Remove variables they are actually bounds on axes or coefficients in formulae
117           if v.id not in ("bounds_longitude", "bounds_latitude", "bounds_level", "bounds_time", "p0"):
118               if re.match("hybrid_\w(_\d+)?", v.id)==None and re.match("(lon|lat)(\d+)_bounds?", v.id)==None: 
119                   # and land sea mask (HiGEM) is not yet working
120                   if not (self.dataset=="HiGEM" and v.id in ("lsm","ocean_depth", "sealand")):
121                       rtvars.append("%s  <B>[ %s ]</B>" % (name, v.id)) 
122        rtvars.sort()
123        return rtvars
124
125    def getDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
126        (north, west, south, east)=self.getHorizontalSpatialDomain(dataset, subset, variable, datasetURI)
127        (vertical_domain, vertical_units)=self.getVerticalSpatialDomain(dataset, subset, variable, datasetURI)
128        (start_time, end_time, interval)=self.getTemporalDomain(dataset, subset, variable, datasetURI)
129        return ((north, west, south, east), (vertical_domain, vertical_units), (start_time, end_time, interval))
130
131    def getHorizontalSpatialDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
132        (self.dataset, self.subset, self.variable, self.datasetURI)=(dataset, subset, variable, datasetURI)
133        # Get the start and end date and time
134        self._openCdmsFile()
135        var=self._getVariable()
136        lat=list(var.getLatitude()[:])
137        if lat[-1]<lat[0]: lat.reverse()
138        (south, north)=(lat[0], lat[-1])
139        lon=var.getLongitude()[:]
140        (west, east)=(lon[0], lon[-1])
141        return (north, west, south, east)
142
143    def getVerticalSpatialDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
144        (self.dataset, self.subset, self.variable, self.datasetURI)=(dataset, subset, variable, datasetURI)
145        self._openCdmsFile()
146        var=self._getVariable()
147        try:
148            levels=var.getLevel()
149            vertical_units=levels.units
150            vertical_domain=tuple(map(lambda x: float(x), levels[:]))
151        except:
152            vertical_domain=("Single level",)
153            vertical_units=None
154        return (vertical_domain, vertical_units)
155
156    def getTemporalDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
157        (self.dataset, self.subset, self.variable, self.datasetURI)=(dataset, subset, variable, datasetURI)
158        self._openCdmsFile()
159        var=self._getVariable()
160        #print self.file, self.variable, self.dataset
161        time_axis=var.getTime()
162        cdtime_keys=("year", "month", "day", "hour", "minute", "second")
163        start_time_components=time_axis.asComponentTime()[0]
164        end_time_components=time_axis.asComponentTime()[-1]
165        start_time=[]
166        end_time=[]
167        for key in cdtime_keys:
168            start_time.append(getattr(start_time_components, key))
169            end_time.append(getattr(end_time_components, key)) 
170        time_units=time_axis.units.split()[0]
171        if time_units[-1]=="s":  time_units=time_units[:-1]
172        if len(time_axis)>1:
173            interval_value=abs(time_axis[1]-time_axis[0])
174        else:
175            interval_value=1  # To stop loops breaking later!
176        return (start_time, end_time, (interval_value, time_units)) 
Note: See TracBrowser for help on using the repository browser.