Changeset 6448 for qesdi


Ignore:
Timestamp:
01/02/10 13:59:33 (10 years ago)
Author:
pnorton
Message:

Modified the code so that numerical variables are displayed as a select box of text strings instead of an text input as before. This is a little ugly + confusing but makes selecting the actual time points much easier.

Location:
qesdi/graphplotter/trunk/graphplotter
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • qesdi/graphplotter/trunk/graphplotter/controllers/buildplot.py

    r6331 r6448  
    8383            vals = reader.getAxisValues(c.selectedVariable, ax) 
    8484             
    85             if type(vals[0]) == str: 
    86                 c.axisSelect[ax] = [''] + vals 
    87             else: 
    88                 c.axisSelect[ax] = "%s - %s" % (min(vals), max(vals)) 
     85            log.debug("vals = %s" % (vals,)) 
     86             
     87            c.axisSelect[ax] = [''] + [str(x) for x in vals] 
    8988         
    90         log.debug("c.axisSelect = %s" % (c.axisSelect,)) 
     89#        log.debug("c.axisSelect = %s" % (c.axisSelect,)) 
  • qesdi/graphplotter/trunk/graphplotter/lib/data_reader.py

    r6401 r6448  
    3232         
    3333        return xdata, ydata 
     34     
     35    def getVariableUnits(self, variable): 
     36         
     37        fin = cdms.open(self.file) 
     38        units = None 
     39         
     40        try: 
     41            var = fin(variable) 
     42            units = var.units 
     43                         
     44        finally: 
     45            fin.close() 
     46         
     47        return units 
     48     
     49    def getAxisUnits(self, variable, axis): 
     50        fin = cdms.open(self.file) 
     51        units = None 
     52         
     53        try: 
     54            var = fin(variable) 
     55            axis = var.getAxis(var.getAxisIndex(axis)) 
     56            units = axis.units 
     57                         
     58        finally: 
     59            fin.close() 
     60         
     61        return units         
    3462     
    3563    def getVariableNames(self): 
     
    89117        selKW = {} 
    90118         
     119        log.debug("selection = %s" % (selection,)) 
     120        log.debug("AxisList = %s" % ([ax.id for ax in var.getAxisList()],)) 
     121         
    91122        for ax in var.getAxisList(): 
    92123            # we don't want to generate a selection for the axis 
     
    104135                lookupVar = fin(lookupVarName) 
    105136                lookup = self._buildLookup(lookupVar) 
     137                 
     138                if value not in lookup: 
     139                    raise Exception("value [%s] not found in lookup [%s]" % (value, lookup)) 
    106140                     
    107141                selKW[ax.id] = lookup[value] 
    108142            else: 
    109143                 
    110                 selKW[ax.id] = value 
     144                selKW[ax.id] = float(value) 
    111145                     
    112146        return selKW 
     
    114148    def _getData(self, var, selKW, axis): 
    115149         
     150         
     151        log.debug("selKW = %s" % (selKW,)) 
     152        
    116153        #get the y data by selecting from the variable 
    117154        ydata = var(squeeze=1, **selKW) 
  • qesdi/graphplotter/trunk/graphplotter/lib/plot_builder.py

    r6401 r6448  
    3737        plt = Plot() 
    3838         
    39         plt.setYLabel(self._getVariableName()) 
    40         plt.setXLabel(self.params['axis']) 
     39        log.debug("reader.getVariableUnits(self.params['variable']) = %s" % (reader.getVariableUnits(self.params['variable']),)) 
     40        log.debug("reader.getAxisUnits(self.params['variable'], self.params['axis']) = %s" % (reader.getAxisUnits(self.params['variable'], self.params['axis']),)) 
     41         
     42        self._setAxisLabels(plt, reader) 
    4143         
    4244        commonItems = self._getCommonItems(selections) 
    43          
     45        log.debug("commonItems = %s" % (commonItems,)) 
    4446        self._setPlotTitle(plt, commonItems) 
    4547         
     
    8486            if i > 900:   
    8587                raise Exception("Too many selections found.") 
    86          
     88             
     89        # remove any suspicous looking selections 
     90        for s in selections: 
     91            for k, v in s.items(): 
     92                if k in ['',None] or v in ['', None]: 
     93                    selections.pop(selections.index(s)) 
     94                    log.warning("Removed selection %s from selection list as it contained empty values." % (s,)) 
     95                 
    8796        return selections 
    8897     
     
    134143        title = self._getVariableName() + ' vs ' + self.params['axis'] 
    135144         
    136         if len(commonItems) > 1:  
     145        if len(commonItems) > 0:  
    137146            title += ' with ' + self._getLineName(commonItems) 
     147         
    138148             
    139149        plt.setTitle(title) 
     
    151161         
    152162        return self.params['variable'] 
     163     
     164    def _setAxisLabels(self, plt, reader): 
     165         
     166        variableUnits = reader.getVariableUnits(self.params['variable']) 
     167         
     168        if variableUnits in [None, '']: 
     169            ylabel = self._getVariableName() 
     170        else: 
     171            ylabel = "%s [%s]" % (self._getVariableName(), variableUnits) 
     172         
     173        plt.setYLabel(ylabel) 
     174 
     175                            
     176        axisUnits = reader.getAxisUnits(self.params['variable'], self.params['axis']) 
     177 
     178        if axisUnits  in [None, '']: 
     179            xlabel = self.params['axis']         
     180        else: 
     181            xlabel = "%s [%s]" % (self.params['axis'], axisUnits) 
     182             
     183        plt.setXLabel(xlabel) 
  • qesdi/graphplotter/trunk/graphplotter/templates/buildplot.html

    r6331 r6448  
    7070        <div> 
    7171            Select Data File: 
    72             ${ h.select('datafile', c.selectedDataFile, c.dataFiles)} 
     72            ${ h.select('datafile', c.selectedDataFile, c.dataFiles, onChange='onRefreshClick()')} 
    7373        </div> 
    7474         
     
    7777         <div> 
    7878            Select Variable: 
    79             ${ h.select('variable', c.selectedVariable, c.variables)} 
     79            ${ h.select('variable', c.selectedVariable, c.variables, onChange='onRefreshClick()')} 
    8080         </div> 
    8181          
     
    8686         <div> 
    8787            Select Plotting Axis: 
    88             ${ h.select('axis', c.selectedAxis, c.axis)} 
     88            ${ h.select('axis', c.selectedAxis, c.axis, onChange='onRefreshClick()')} 
    8989         </div> 
    9090          
     
    102102            <py:for each="axSelect in c.axisSelect.keys()"> 
    103103                ${axSelect}: 
    104                 <py:if test="type(c.axisSelect[axSelect]) is str"> 
    105                 Range ${c.axisSelect[axSelect] + ' ' + h.text('sel_' + axSelect, value=getattr(c, 'sel_' + axSelect))} 
    106                 </py:if> 
    107                 <py:if test="type(c.axisSelect[axSelect]) is not str"> 
    108104                ${h.select('sel_' + axSelect, getattr(c, 'sel_' + axSelect), c.axisSelect[axSelect])} 
    109                 </py:if> 
     105                 
    110106                <br /> 
    111107            </py:for> 
     
    136132    <input type="button" value="Remove Selection" onClick=""></input> 
    137133     
    138     <input type="button" value="Refresh" onClick="onRefreshClick();"></input> 
     134    <input type="button" value="Clear Selections" onClick="onRefreshClick();"></input> 
    139135    <input type="button" value="Plot" onClick="onPlotClick();"></input> 
    140136</body> 
  • qesdi/graphplotter/trunk/graphplotter/tests/functional/test_buildplot.py

    r6313 r6448  
    114114         
    115115        # check that the index values appear in the response 
    116         for ax in ['circle','square']: 
     116        for ax in ['circle','square', 'triangle']: 
    117117            for v in axisValues[ax]: 
    118118                assert  '<option value="%s">%s</option>' % (v, v) in response, " option '%s' wasn't found in the response" % (v,) 
    119119             
    120         # check that the range appears in the response 
    121         assert '1.5 - 3.8' in response 
  • qesdi/graphplotter/trunk/graphplotter/tests/unit/test_data_reader.py

    r6401 r6448  
    149149        assert mockVar.getAxis.call_args == ((mockVar.getAxisIndex.return_value,), {}) 
    150150         
    151      
     151    @patch('graphplotter.lib.data_reader.cdms', spec=True) 
     152    def test_006_getVariableUnits(self, mockCDMS): 
     153         
     154        mockFH = mockCDMS.open.return_value 
     155         
     156        mockVar = Mock() 
     157        mockVar.units = Mock() 
     158         
     159        def fhOpenVar(name): 
     160            if name == 'var1': 
     161                return mockVar 
     162            elif name == 'axisB_var': 
     163                return ['one','two','three'] 
     164            else: 
     165                raise Exception("Unknown variable %s" % (name,)) 
     166             
     167        mockFH.side_effect = fhOpenVar 
     168         
     169        assert self.reader.getVariableUnits('var1') == mockVar.units 
     170         
     171    @patch('graphplotter.lib.data_reader.cdms', spec=True) 
     172    def test_006_getVariableUnits(self, mockCDMS): 
     173         
     174        mockFH = mockCDMS.open.return_value 
     175         
     176        mockVar = Mock() 
     177        mockVar.units = Mock() 
     178         
     179        def fhOpenVar(name): 
     180            if name == 'var1': 
     181                return mockVar 
     182            elif name == 'axisB_var': 
     183                return ['one','two','three'] 
     184            else: 
     185                raise Exception("Unknown variable %s" % (name,)) 
     186             
     187        mockFH.side_effect = fhOpenVar 
     188         
     189        assert self.reader.getVariableUnits('var1') == mockVar.units 
     190 
     191    @patch('graphplotter.lib.data_reader.cdms', spec=True) 
     192    def test_006_getAxisUnits(self, mockCDMS): 
     193         
     194        mockFH = mockCDMS.open.return_value 
     195         
     196        mockVar = Mock() 
     197         
     198        mockUnits = mockVar.getAxis.return_value.units 
     199         
     200        def fhOpenVar(name): 
     201            if name == 'var1': 
     202                return mockVar 
     203            elif name == 'axisB_var': 
     204                return ['one','two','three'] 
     205            else: 
     206                raise Exception("Unknown variable %s" % (name,)) 
     207             
     208        mockFH.side_effect = fhOpenVar 
     209         
     210        assert self.reader.getAxisUnits('var1', 'axisA') == mockUnits 
     211         
     212        #check the correct axis index was returned 
     213        assert mockVar.getAxisIndex.called 
     214        assert mockVar.getAxisIndex.call_args == (('axisA',),{}), \ 
     215               "getAxisIndex args (=%s) were not as expected (=%s)" % (mockVar.getAxisIndex.call_args, (('axisA',),{})) 
     216         
     217        assert mockVar.getAxis.called 
     218        assert mockVar.getAxis.call_args == \ 
     219              ((mockVar.getAxisIndex.return_value,), {})         
  • qesdi/graphplotter/trunk/graphplotter/tests/unit/test_plot_builder.py

    r6401 r6448  
    4545        #check that the draw was called with the data 
    4646        assert plot.draw.called 
    47         assert plot.draw.call_args == (('xdata', 'ydata'), {}) 
     47         
     48        #ignore any keyword arguments 
     49        assert plot.draw.call_args[0] == ('xdata', 'ydata'), \ 
     50        "plot.draw.call_args (=%s) didn't match expected (=%s)" % (plot.draw.call_args[0], ('xdata', 'ydata') ) 
    4851     
    4952    @patch("graphplotter.lib.plot_builder.Plot", spec=True) 
     
    8487        assert mockReader.getData.call_args_list == expectedArgsList 
    8588         
     89    @patch("graphplotter.lib.plot_builder.Plot", spec=True) 
     90    @patch("graphplotter.lib.plot_builder.DataReader", spec=True) 
     91    def test_003_axisLabels(self, mockDataReader, mockLinplot): 
    8692         
     93        # set the return value to be used as input in linplot 
     94        mockDataReader.return_value.getData.return_value = ('xdata', 'ydata') 
     95         
     96        mockReader = mockDataReader.return_value 
     97        mockReader.getVariableUnits.return_value = 'variable units' 
     98        mockReader.getAxisUnits.return_value = 'axis units' 
     99         
     100        plot = mockLinplot() 
     101         
     102        builder = PlotBuilder(self.params, self.config) 
     103        builder.buildPlot() 
     104         
     105        expectedXLabel= "%s [%s]" % (self.params['axis'], mockReader.getAxisUnits.return_value) 
     106        expectedYLabel= "%s [%s]" % (self.params['variable'], mockReader.getVariableUnits.return_value) 
     107 
     108        assert plot.setXLabel.called 
     109        expectedArgs = ((expectedXLabel,), {}) 
     110        assert plot.setXLabel.call_args == expectedArgs, \ 
     111            " setXLabel args (=%s) weren't as expected (=%s)" % (plot.setXLabel.call_args, expectedArgs) 
     112         
     113        assert plot.setYLabel.called 
     114        expectedArgs = ((expectedYLabel,), {}) 
     115        assert plot.setYLabel.call_args == expectedArgs, \ 
     116            " setYLabel args (=%s) weren't as expected (=%s)" % (plot.setYLabel.call_args, expectedArgs) 
     117         
     118        assert mockReader.getVariableUnits.called 
     119        assert mockReader.getVariableUnits.call_args == ((self.params['variable'],),{}) 
     120        assert mockReader.getAxisUnits.called 
     121        assert mockReader.getAxisUnits.call_args == ((self.params['variable'], self.params['axis']),{}) 
     122         
     123    @patch("graphplotter.lib.plot_builder.Plot", spec=True) 
     124    @patch("graphplotter.lib.plot_builder.DataReader", spec=True) 
     125    def test_003_axisLabelsWhenNoUnits(self, mockDataReader, mockLinplot): 
     126         
     127        # set the return value to be used as input in linplot 
     128        mockDataReader.return_value.getData.return_value = ('xdata', 'ydata') 
     129         
     130        mockReader = mockDataReader.return_value 
     131        mockReader.getVariableUnits.return_value = None 
     132        mockReader.getAxisUnits.return_value = None 
     133         
     134        #set the return value to a string instead of a PIL image 
     135        plot = mockLinplot() 
     136         
     137        builder = PlotBuilder(self.params, self.config) 
     138        builder.buildPlot() 
     139         
     140        expectedXLabel= self.params['axis'] 
     141        expectedYLabel= self.params['variable'] 
     142 
     143        expectedArgs = ((expectedXLabel,), {}) 
     144        assert plot.setXLabel.call_args == expectedArgs, \ 
     145            " setXLabel args (=%s) weren't as expected (=%s)" % (plot.setXLabel.call_args, expectedArgs) 
     146         
     147        expectedArgs = ((expectedYLabel,), {}) 
     148        assert plot.setYLabel.call_args == expectedArgs, \ 
     149            " setYLabel args (=%s) weren't as expected (=%s)" % (plot.setYLabel.call_args, expectedArgs) 
     150 
     151        # the same should happen with empty strings 
     152        mockReader.getVariableUnits.return_value = '' 
     153        mockReader.getAxisUnits.return_value = '' 
     154         
     155        builder.buildPlot() 
     156         
     157        expectedArgs = ((expectedXLabel,), {}) 
     158        assert plot.setXLabel.call_args == expectedArgs, \ 
     159            " setXLabel args (=%s) weren't as expected (=%s)" % (plot.setXLabel.call_args, expectedArgs) 
     160         
     161        expectedArgs = ((expectedYLabel,), {}) 
     162        assert plot.setYLabel.call_args == expectedArgs, \ 
     163            " setYLabel args (=%s) weren't as expected (=%s)" % (plot.setYLabel.call_args, expectedArgs) 
Note: See TracChangeset for help on using the changeset viewer.