source: TI02-CSML/branches/csml-cdms2/API/csmlutils.py @ 3627

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/branches/csml-cdms2/API/csmlutils.py@3627
Revision 3627, 5.6 KB checked in by spascoe, 12 years ago (diff)

This branch contains CSML converted to use cdat_lite-5.

  • convertcdms was run on the source
  • the MA.set_print_limit call was changed to the numpy equivilent
  • The tests were changed to account for the existence of numpy scalar types.

All tests, except the two known to fail, pass on i686 ubuntu.

Line 
1# Adapted for numpy/ma/cdms2 by convertcdms.py
2'''csml utils contains useful utility functions that don't belong anywhere else'''
3import csml
4
5def listify(item):
6    ''' listify checks if an item is a list, if it isn't it puts it inside a list and returns it.
7    @return:   A lways returns a list object'''
8    if type(item) is list:
9        return item
10    else:
11        return [item]   
12   
13def fixLongitude(request, kwargs):
14    '''
15    deals with longitude requests
16    if the request is in -ve,+ve eg (-30,30) but the data is in (0,360) need to handle this by changing the args.
17    @param kwargs:   dictionary of kwargs representing a selection e.g. {'longitude':(0,30), 'latitude':(-20,20)}
18    @return:    dictionary of kwargs, altered from input to fix longitude values
19    '''
20    def _anyitemlessthanzero(listofitems):
21        for item in listofitems:
22            if item <0:
23                return True
24        return False
25    for key in request.keys():
26        if kwargs.has_key(key):
27            if type(kwargs[key]) is not tuple:             
28                continue               
29            elif key == 'longitude': #how do we test if it is longitude properly?
30                if _anyitemlessthanzero(request[key]):
31                    pass #no need to convert request if data is also -ve to +ve
32                else:                                     
33                    lonMin=kwargs[key][0]
34                    lonMax=kwargs[key][1]                                       
35                    if lonMin >=0:
36                        pass
37                    else:                   
38                        new_lonMin = (lonMin + 360.0) % 360.0
39                        new_lonMax = (lonMax + 360.0) % 360.0   
40                        if new_lonMin == new_lonMax:
41                            kwargs[key]=(0, 360)       
42                        else:
43                            kwargs[key]=(new_lonMin, new_lonMax)
44    return kwargs
45                 
46def nudgeSingleValuesToAxisValues(value, axisValues, minBound=None, maxBound=None):
47        """
48        Takes a value and checks if it is in the axisValues array. If not, it nudges the
49        value to the nearest neighbour in axis. It returns the new value twice along
50        with a message describing the change.
51       
52        minBound and maxBound added as options.
53        If a value is outside of minBound or maxBound it is nudged so that it is within.       
54       
55        @param value:    value to check
56        @param axisValues:    array of values
57        @param minBound:    minimum return value
58        @param minBound:    maxmimum return value
59        @return:    nearest neighbour of value
60        """
61        bounds=False
62        reverseBounds=False
63        #TODO - rewrite this so it is legible!
64        #determine if bounds have been provided and if they are of the form (-30,30)  or (330, 30)
65        if minBound!=None:
66            if maxBound!=None:                               
67                bounds =True
68                if minBound > maxBound:           
69                    reverseBounds = True
70        rtMessage=""
71        newValue=None
72        def __fixTimes(value, axisValues):
73            newValue = csml.csmllibs.csmltime.getTimeAsValue(value)
74            newAxisValues=[]
75            for ax in axisValues:
76                newAxisValues.append(csml.csmllibs.csmltime.getTimeAsValue(ax))
77            return newValue, newAxisValues               
78       
79        if value in axisValues:
80            newValue=value
81        else:           
82            if str(value).find('T') != -1:
83                minBound,minBound=None,None,
84                bounds,reverseBounds=False,False             
85                value, axisValues=__fixTimes(value,axisValues)
86            sortedAxis=[]           
87            if bounds == True:
88               if reverseBounds!=True:
89                    for i in axisValues:
90                        if i >= minBound:
91                            if i <= maxBound:
92                                sortedAxis.append(i)
93                         
94               else:
95                   for i in axisValues:
96                       if i >= minBound:
97                           sortedAxis.append(i)
98                       elif i >= maxBound:
99                            sortedAxis.append(i)                                     
100            else:
101                for i in axisValues:
102                    sortedAxis.append(i)
103            sortedAxis.sort()   
104
105            if value<sortedAxis[0]:
106                if sortedAxis[0] < maxBound:
107                    newValue=sortedAxis[0]
108                else:
109                    newValue=sortedAxis[-1]
110            elif value>sortedAxis[-1]:
111                newValue=sortedAxis[-1]
112            else:
113                for i in range(len(axisValues)):
114                    if i<(len(axisValues)-1):
115                        (current, nextone)=(axisValues[i], axisValues[i+1])
116                        if current>nextone:
117                            tempc=nextone
118                            nextone=current
119                            current=tempc
120                        if value>current and value<nextone:
121                            lowergap=value-current
122                            uppergap=nextone-value
123                            if uppergap==lowergap:
124                                newValue=nextone
125                            elif uppergap>lowergap:
126                                newValue=current
127                            elif uppergap<lowergap:
128                                newValue=nextone                       
129                            break
130            if newValue==None:
131                axisType='unknown'
132                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)       
133        #        print rtMessag
134        if isinstance(newValue, float):
135            if len(str(int(newValue))) ==14: # it's a time
136                newValue=csml.csmllibs.csmltime.convertValueToCSML(newValue)   
137        return (newValue)   
138               
Note: See TracBrowser for help on using the repository browser.