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

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

Nudge to nearest neighbour function added to enable approximate requests for data - thanks Ag

Line 
1'''csml utils contains useful  utility functions'''
2
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. Always returns a list object'''
6    if type(item) is list:
7        return item
8    else:
9        return [item]
10   
11   
12   
13#deal with longitude requests
14#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.
15def fixLongitude(request, kwargs):
16    for key in request.keys():
17        if type(kwargs[key]) is not tuple:
18            continue
19        elif key == 'longitude': #how do we test if it is longitude properly?
20            for val in request[key]:
21                if val < 0:
22                    pass
23                else:
24                    if kwargs.has_key(key):
25                        if kwargs[key][0] < 0:
26                            kwargs[key]=(kwargs[key][0]+360,kwargs[key][1])
27                        if kwargs[key][1] < 0:
28                            kwargs[key]=(kwargs[key][0],kwargs[key][1]+360)
29    return kwargs
30                       
31                       
32                       
33def nudgeSingleValuesToAxisValues(value, axisValues):
34        """
35        Takes a value and checks if it is in the axisValues array. If not, it nudges the
36        value to the nearest neighbour in axis. It returns the new value twice along
37        with a message describing the change.
38        """
39        #import cdms
40        rtMessage=""
41        newValue=None
42       
43        if value in axisValues:
44            newValue=value
45        else:
46            sortedAxis=[]
47            for i in axisValues:
48                sortedAxis.append(i)
49            sortedAxis.sort()
50           
51            if value<sortedAxis[0]:
52                newValue=sortedAxis[0]
53            elif value>sortedAxis[-1]:
54                newValue=sortedAxis[-1]
55            else:
56                for i in range(len(axisValues)):
57                    if i<(len(axisValues)-1):
58                        (current, nextone)=(axisValues[i], axisValues[i+1])
59                        if current>nextone:
60                            tempc=nextone
61                            nextone=current
62                            current=tempc
63                   
64                        if value>current and value<nextone:
65                            lowergap=value-current
66                            uppergap=nextone-value
67                            if uppergap==lowergap:
68                                newValue=nextone
69                            elif uppergap>lowergap:
70                                newValue=current
71                            elif uppergap<lowergap:
72                                newValue=nextone                       
73                            break
74            if newValue==None:
75                rtMessage="%s axis selected value '%s' nudged to nearest value in real axis '%s' ;" % (axisType, value, newValue)       
76                print rtMessage         
77                   
78        return (newValue)                           
Note: See TracBrowser for help on using the repository browser.