source: TI02-CSML/trunk/csml/API/ops_RaggedSectionFeature.py @ 3013

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

ragged section methods - under development

Line 
1''' ops_RaggedSectionFeature  contains operations for RaggedSectionFeatures'''
2import csml
3import MA,MV,Numeric
4import cdms
5
6
7def testmethod(self):
8    print 'testmethod for ragged section feature'
9    return 'testmethod 2'
10
11def getDomain(self):
12    #returns domain as a dictionary of ordinates {name: [values], ...}
13    self.domain={}
14   
15    #get lat lon station locations
16    locations= self.stationLocations.CONTENT.split()
17    latitude=[]
18    longitude=[]
19    for i in range(0, len(locations)-1,2):
20        latitude.append(locations[i])
21        longitude.append(locations[i+1])
22       
23    self.domain['latitude']=latitude
24    self.domain['longitude']=longitude
25   
26    #get station times
27    times=[]
28    for t in self.stationTimes.CONTENT.split():
29        times.append(t)
30    self.domain['time']=times
31
32    #get vertical dimension
33    gridOrd= self.value.sectionDomain.coordTransformTable.gridOrdinates
34    name=gridOrd.coordAxisLabel.CONTENT
35    if hasattr(gridOrd.coordAxisValues, 'insertedExtract'):
36        self.domain[name], fill, axisorder, units=gridOrd.coordAxisValues.insertedExtract.getData()
37    else:           
38        valList=[]
39        vals=gridOrd.coordAxisValues.coordinateList.CONTENT
40        for val in vals.split(): 
41            valList.append(eval(val))           
42        self.domain[name]=valList   
43        self._depths=valList
44        self._depthname=name
45           
46    return self.domain
47       
48
49def subsetByTime(self, outputdir=None, ncname='pointseries.nc' ,times=None):
50    if outputdir is not None:
51        self.outputdir=outputdir
52    elif csml.API.csmlContainer.globalContainer.OUTPUTDIR is not None:
53        self.outputdir=csml.API.csmlContainer.globalContainer.OUTPUTDIR
54     
55    if self.outputdir is not None:
56        pathToSubsetNetCDF=self.outputdir + '/' +ncname
57    else: 
58        pathToSubsetNetCDF=ncname
59    if self.outputdir is not None:
60        csml.csmllibs.csmlextra.checkDirExists(self.outputdir)
61    if type(times) is str:
62        selection = tuple(csml.csmllibs.csmlextra.listify(times))
63    else:
64        selection = times 
65    tlist=[]   
66    for val in self.stationTimes.CONTENT.split():
67        tlist.append(val)
68   
69    indices=[]
70    if  len(selection) ==2:       
71        selectedTimes=[]
72        for domaintime in tlist:
73            if selection[0] == domaintime:
74                minIndex=tlist.index(domaintime)
75                selectedTimes.append(domaintime)
76            if domaintime > selection[0]:
77                if domaintime < selection[1]:
78                    selectedTimes.append(domaintime)         
79            if selection[1] == domaintime:
80                maxIndex=tlist.index(domaintime)
81                selectedTimes.append(domaintime)         
82                break   
83                   
84    elif len(selection)==1:   #point only
85        for domaintime in tlist:
86            if selection[0] == domaintime:             
87                minIndex=tlist.index(domaintime)
88                maxIndex=minIndex
89                selectedTimes=selection
90                break
91   
92    #get maximum profile length:
93    lengths=self.profileLength.CONTENT.split()
94    maxlen=0
95    for l in lengths:
96        testlen=eval(l)
97        if testlen > maxlen:
98            maxlen =testlen
99
100    #assuming each timestep is in a separate file, minIndex and maxIndex refer to the position of files in the series.       
101    fulldata=[]
102    fileList=[]
103    filenames=self.value.rangeSet.arrayDescriptor.components.fileList.fileNames.CONTENT.split() 
104    for i in range(minIndex, maxIndex+1):
105        fileList.append(filenames[i])
106        data,fillvalue, axisorder, units=self.value.rangeSet.arrayDescriptor.components.getData(fileposition=i)       
107        if len(data)<maxlen:
108            data.resize(maxlen)
109        fulldata.append(data)
110           
111   
112    #Write out CSML feature
113       
114    #Write out NetCDF file
115        #Now write out the NetCDF File:   
116    nc=cdms.open(pathToSubsetNetCDF,'w')
117    var=MV.array(fulldata)
118    var.id=self.name.CONTENT
119    var.name=self.name.CONTENT
120    var.units=units[0] # hopefully there is just one unit in this list..
121    setattr(var, 'missing_value' ,fillvalue)
122   
123    floatTimes=[]
124   
125    tOne=csml.csmllibs.csmltime.getCDtime(selection[0])
126    tbase=csml.csmllibs.csmltime.getBaseUnits(tOne)
127    for time in selectedTimes:
128        time=csml.csmllibs.csmltime.getCDtime(time).torel(tbase)
129        floatTimes.append(time.value)
130    timeAx=cdms.createAxis(floatTimes)
131    timeAx.designateTime()
132    timeAx.id='time'
133    timeAx.units=tbase 
134    var.setAxis(0,timeAx)     
135   
136    depthAx=cdms.createAxis(Numeric.arrayrange(maxlen))
137    depthAx.id='depth'
138    #timeAx.units=tbase 
139    var.setAxis(1,depthAx)     
140   
141    nc.write(var)
142    nc.close()   
143    print 'NetCDF file written to %s'%pathToSubsetNetCDF
144    return None,None,None
145    #return subsettedFeature, pathToSubsetNetCDF, descriptor
146   
147   
148    #fextract=self.value.rangeSet.arrayDescriptor.components
149    #uom = self.value.rangeSet.arrayDescriptor.uom
150    #print minIndex
151    #print maxIndex
152    #data, fillvalue=fextract.getDataFromChunks(minIndex, maxIndex)
153    #print data
154   
155    #return subsettedFeature, pathToSubsetNetCDF, descriptor
Note: See TracBrowser for help on using the repository browser.