source: TI02-CSML/trunk/csml/API/csmlutils.py @ 3267

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/API/csmlutils.py@3267
Revision 3267, 5.5 KB checked in by domlowe, 12 years ago (diff)

Documenting CSML code - not complete

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