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

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

Put all the old code in the old_stuff branch.

  • Property svn:executable set to *
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           rtvars.append("%s  <B>[ %s ]</B>" % (name, v.id)) 
113        rtvars.sort()
114        return rtvars
115
116    def getDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
117        (north, west, south, east)=self.getHorizontalSpatialDomain(dataset, subset, variable, datasetURI)
118        (vertical_domain, vertical_units)=self.getVerticalSpatialDomain(dataset, subset, variable, datasetURI)
119        (start_time, end_time, interval)=self.getTemporalDomain(dataset, subset, variable, datasetURI)
120        return ((north, west, south, east), (vertical_domain, vertical_units), (start_time, end_time, interval))
121
122    def getHorizontalSpatialDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
123        (self.dataset, self.subset, self.variable, self.datasetURI)=(dataset, subset, variable, datasetURI)
124        # Get the start and end date and time
125        self._openCdmsFile()
126        var=self._getVariable()
127        lat=list(var.getLatitude()[:])
128        if lat[-1]<lat[0]: lat.reverse()
129        (south, north)=(lat[0], lat[-1])
130        lon=var.getLongitude()[:]
131        (west, east)=(lon[0], lon[-1])
132        return (north, west, south, east)
133
134    def getVerticalSpatialDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
135        (self.dataset, self.subset, self.variable, self.datasetURI)=(dataset, subset, variable, datasetURI)
136        self._openCdmsFile()
137        var=self._getVariable()
138        try:
139            levels=var.getLevel()
140            vertical_units=levels.units
141            vertical_domain=tuple(map(lambda x: float(x), levels[:]))
142        except:
143            vertical_domain=("Single level",)
144            vertical_units=None
145        return (vertical_domain, vertical_units)
146
147    def getTemporalDomain(self, dataset=None, subset=None, variable=None, datasetURI=None):
148        (self.dataset, self.subset, self.variable, self.datasetURI)=(dataset, subset, variable, datasetURI)
149        self._openCdmsFile()
150        var=self._getVariable()
151        #print self.file, self.variable, self.dataset
152        time_axis=var.getTime()
153        cdtime_keys=("year", "month", "day", "hour", "minute", "second")
154        start_time_components=time_axis.asComponentTime()[0]
155        end_time_components=time_axis.asComponentTime()[-1]
156        start_time=[]
157        end_time=[]
158        for key in cdtime_keys:
159            start_time.append(getattr(start_time_components, key))
160            end_time.append(getattr(end_time_components, key)) 
161        time_units=time_axis.units.split()[0]
162        if time_units[-1]=="s":  time_units=time_units[:-1]
163        if len(time_axis)>1:
164            interval_value=abs(time_axis[1]-time_axis[0])
165        else:
166            interval_value=1  # To stop loops breaking later!
167        return (start_time, end_time, (interval_value, time_units)) 
Note: See TracBrowser for help on using the repository browser.