source: TI03-DataExtractor/branches/old_stuff/latest_dx/dx/pydxs/RequestSizer.py @ 793

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI03-DataExtractor/branches/old_stuff/latest_dx/dx/pydxs/RequestSizer.py@793
Revision 793, 5.2 KB checked in by astephen, 13 years ago (diff)

Put all the old code in the old_stuff branch.

Line 
1#!/usr/bin/env python
2
3#   Copyright (C) 2004 CCLRC & NERC( Natural Environment Research Council ).
4#   This software may be distributed under the terms of the
5#   Q Public License, version 1.0 or later. http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
6
7"""
8RequestSizer.py
9===============
10
11Contains the class RequestSizer that is used to calculate the size of
12a request.
13
14""" 
15
16# Import library modules
17import os, sys, cdms, re
18
19# Import package modules
20from serverConfig import *
21from common import *
22from DateTimeManager import *
23from Datasetdb import Datasetdb
24
25
26timePattern=re.compile("(\d{4})-(\d{1,2})-(\d{1,2}).(\d{1,2}):(\d{1,2}):(\d{1,2}(\.\d+)?)")
27
28class RequestSizer:
29    """
30    Works out how big a request is.timePattern.match(request["startDateTime_1"]).groups(
31    """
32
33    def __init__(self, request):
34        """
35        Sets off sizer alrogithm.
36        """
37        self._getRequestDetails(request)
38       
39        (npoints, varType)=self._calculateSize()       
40
41        if varType=="f":
42            size=npoints*4.
43        elif varType=="d":
44            size=npoints*8
45        elif varType=="i":
46            size=npoints   
47                   
48        self.npoints=npoints       
49        self.size=size
50        print self.npoints, self.size, "ARE THE VERBS"
51       
52       
53    def _getRequestDetails(self, request):
54        """
55        Sets the instance variables needed to work out required data.
56        """         
57        if request.has_key("datasetURI_1"):
58            self.datafile=request["datasetURI_1"]               
59        else:
60            dsetdb=Datasetdb()
61            dsg=request["datasetGroup_1"]
62            ds=request["dataset_1"]
63            self.datafile=dsetdb.getDatasetURI(dsg, ds)
64
65        self.varID=request["variable_1"]
66       
67        self.horiz={}
68        keys=["north", "west", "south", "east"]
69        for key in keys:
70            self.horiz[key]=request["%sernExtent" % key]
71           
72        vert=request["verticalDomain_1"]
73        if type(vert) in (type((1,2)), type([1,2])):
74            if len(vert)==1:
75                self.vert==1
76            else:
77                self.vert=vert
78        else:
79            self.vert=1
80           
81        self.time={}
82        self.time["start"]=self._intAll(timePattern.match(request["startDateTime_1"]).groups()[:6])
83        self.time["end"]=self._intAll(timePattern.match(request["endDateTime_1"]).groups()[:6])
84        interval=request["timeIntervalValue_1"]
85        if type(interval)==type(""): 
86            interval=int(float(interval))
87        self.time["interval"]=(interval, request["timeIntervalUnits_1"])
88       
89
90
91    def _intAll(self, stringList):
92        """
93        Takes a list of strings and returns them as ints.
94        """
95        return [int(i) for i in stringList]
96               
97               
98    def getValuesInRangeOLDOLD(start, end, array):
99        """
100        Takes a start and end value and returns the
101        values in the array that are between them.
102        """
103        # check all are floats
104        array=map(lambda x: float(x), list(array))
105        if array[0]>array[-1]: array.reverse()
106        if start>end:  (start, end)=(end, start)
107        (start, end)=(float(start), float(end))
108        rtarray=[]
109        for i in array:
110            if i>=start and i<=end:
111                rtarray.append(i)
112        if rtarray==[]:
113            rtarray=[i]
114        print "RT", rtarray
115        return rtarray
116   
117
118    def _calculateSize(self):
119        """
120        Calculates the number of data points in a request.
121        """
122        cdmsFile=cdms.open(self.datafile)       
123        var=cdmsFile[self.varID]
124       
125        # Get list of variable axes
126        axes=var.getAxisList()
127       
128        npoints=1
129        # Work through all axes capturing the number of points within the interval
130       
131        for axis in axes:
132
133            if axis.isTime(): 
134                timeSteps=createList(self.time["start"], self.time["end"], self.time["interval"])
135                multiplier=len(timeSteps)
136               
137            elif axis.isLongitude(): 
138                multiplier=len(getValuesInRange(self.horiz["west"], self.horiz["east"], axis[:]))
139
140            elif axis.isLatitude():
141                multiplier=len(getValuesInRange(self.horiz["south"], self.horiz["north"], axis[:]))
142
143            elif axis.isLevel():
144                if self.vert==1:
145                    multiplier=1
146                else:
147                    multiplier=len(getValuesInRange(self.vert[0], self.vert[-1], axis[:]))             
148           
149            print axis.id," has point count: ", multiplier
150            npoints=npoints*multiplier
151
152        print "Total points:", npoints
153        cdmsFile.close()
154         
155        return (npoints, var.typecode())
156       
157       
158if __name__=="__main__":
159
160     x=RequestSizer({"westernExtent":0, "easternExtent":358, "northernExtent":6.66, 
161                     "southernExtent":6.66, "startDateTime_1":"1999-09-01T00:00:00",
162                     "endDateTime_1":"1999-09-01T00:00:00", "timeIntervalValue_1":6,
163                     "timeIntervalUnits_1":"hours", "verticalDomain_1":"Single level",
164                     "datasetGroup_1":"Test Data Group 3", "dataset_1":"Test Dataset 3",
165                     "variable_1":"var3"})
166     print x.size     
167     sys.exit()
168     x=RequestSizer({"westernExtent":50, "easternExtent":150, "northernExtent":40, 
169                     "southernExtent":-60, "startDateTime_1":"1999-09-02T00:00:00",
170                     "endDateTime_1":"1999-09-04T18:00:00", "timeIntervalValue_1":6,
171                     "timeIntervalUnits_1":"hours", "verticalDomain_1":1000,
172                     "datasetURI_1":"/dxd/bigdata.xml", "variable_1":"t"})
173     print x.size
174     x=RequestSizer({"westernExtent":50, "easternExtent":150, "northernExtent":40, 
175                     "southernExtent":-60, "startDateTime_1":"1999-09-02T00:00:00",
176                     "endDateTime_1":"1999-09-02T18:00:00", "timeIntervalValue_1":6,
177                     "timeIntervalUnits_1":"hours", "verticalDomain_1":(1000,850,100),
178                     "datasetURI_1":"/dxd/bigdata.xml", "variable_1":"t"})
179     print x.size   
Note: See TracBrowser for help on using the repository browser.