source: qesdi/graphplotter/trunk/graphplotter/lib/data_reader.py @ 6319

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/qesdi/graphplotter/trunk/graphplotter/lib/data_reader.py@6319
Revision 6319, 3.5 KB checked in by pnorton, 11 years ago (diff)

Enabled plotting against an axis of named values as well as numeric values.

Line 
1'''
2Created on 14 Jan 2010
3
4@author: pnorton
5'''
6
7import cdms2 as cdms
8import logging
9
10log = logging.getLogger(__name__)
11
12class DataReader(object):
13   
14    def __init__(self, file, axisLookup):
15       
16        self.file = file
17        self.axisLookup = axisLookup
18   
19    def getData(self, variable, axis, selection):
20       
21        fin = cdms.open(self.file)
22       
23        try:
24            var = fin(variable)
25           
26            selKW = self._buildSelectionKeywords(fin, var, axis, selection)
27           
28            xdata, ydata = self._getData(var, selKW, axis)
29           
30        finally:
31            fin.close()
32       
33        return xdata, ydata
34   
35    def getVariableNames(self):
36        fin = cdms.open(self.file)
37       
38        variableNames = None
39
40        try:
41            variableNames = fin.listvariables()
42        finally:
43            fin.close()
44       
45        return variableNames
46   
47    def getAxisNames(self, variable):
48        fin = cdms.open(self.file)
49       
50        axisNames = None
51        try:
52            var = fin(variable)
53            axisNames = var.getAxisIds()
54        finally:
55            fin.close()
56       
57        return axisNames
58   
59    def getAxisValues(self, variable, axis):
60        fin = cdms.open(self.file)
61       
62        axisValues = None
63        try:
64            var = fin(variable)
65           
66            if axis in self.axisLookup:
67                axisVar = fin(self.axisLookup[axis])
68                axisValues = axisVar[:]
69                if type(axisValues[0]) is not str:
70                    axisValues = [self._getString(n) for n in axisValues]               
71            else:
72                axis = var.getAxis(var.getAxisIndex(axis))
73                axisValues = axis[:]
74               
75        finally:
76            fin.close()
77       
78        return axisValues
79   
80    def getSelectionData(self, variable, axis):
81        """
82        Get the data require to build a selection control to set the values of
83        the other axis given that variable and axis have already been selected.
84        """
85        pass
86   
87    def _buildSelectionKeywords(self, fin, var, axis, selection):
88        selKW = {}
89       
90        for ax in var.getAxisList():
91            # we don't want to generate a selection for the axis
92            # that will be used for the xdata
93            if ax.id == axis:
94                continue
95       
96            value = selection[ax.id]
97   
98            if ax.id in self.axisLookup:
99                # get the name of the variable that maps the strings given to
100                # the index on the variable's axis.
101                lookupVarName = self.axisLookup[ax.id]
102       
103                lookupVar = fin(lookupVarName)
104                lookup = self._buildLookup(lookupVar)
105                   
106                selKW[ax.id] = lookup[value]
107            else:
108               
109                selKW[ax.id] = value
110                   
111        return selKW
112   
113    def _getData(self, var, selKW, axis):
114       
115        #get the y data by selecting from the variable
116        ydata = var(squeeze=1, **selKW)
117       
118        #get the x-data from the named axis
119        xdata = self.getAxisValues(var.id, axis)
120       
121        return xdata, ydata
122   
123    def _getString(self, n):
124        if type(n) is str:
125            return n
126        else:
127            return ''.join([str(x) for x in n])
128
129    def _buildLookup(self, var):
130        lookup = {}
131        for i, n in enumerate(var):
132            lookup[self._getString(n)] = i
133   
134        return lookup   
Note: See TracBrowser for help on using the repository browser.