source: TI02-CSML/trunk/csml/API/ops_FileExtract.py @ 2562

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

subsetting to point basic code added

Line 
1''' ops_AbstractFileExtract  contains operations for AbstractFileExtracts'''
2import csml.csmllibs.csmldataiface
3import sys
4import Numeric
5import MA
6
7
8class DataContainer(object):
9    #dataArray needs to be the standards data container   
10    def __init__(self, data=None):
11        self.dataArray=None
12        if data is not None:
13            self.data=data
14            self.setup()
15   
16    def setup(self):
17        try: 
18            self.dataArray=Numeric.array(self.data)
19        except MA.MA.MAError:
20            self.dataArray=self.data.tolist()
21            self.dataArray=Numeric.array(self.dataArray)
22         
23def testmethod(self):
24    print 'testmethod for AbstractFileExtract feature'
25    return 'testmethod AbstractFileExtract'
26
27
28def getAxisInfo(self, varName):
29    pass
30
31def getData(self,  fileposition=None,**kwargs):
32    #file position defines the position of the filename if a list of filenames exists
33    #**kwargs can hold subsetting request.
34    #get the right file  ##TO DO< check this is ok with FILE LIST
35       
36    # TODO - cannot subset times within an individual file - no way to determine the original time crs..
37   
38    if fileposition is not None:
39        try:
40            file =self.fileList.fileNames.CONTENT.split()[fileposition]
41        except:
42            file=self.fileName.CONTENT
43    else:
44        file=self.fileName.CONTENT
45    #open the file
46    DI = csml.csmllibs.csmldataiface.DataInterface()
47    DI=DI.getUnknownInterfaceType(file)
48    DI.openFile(file)
49    DI.setAxis(self.variableName.CONTENT)
50    try:
51        DI.setAxis(self.variableName.CONTENT)
52        data=DI.getDataForAxis()
53        dataArray=data
54        fillvalue=None
55        axisorder=None
56        units=None
57    except:
58        DI.setVariable(self.variableName.CONTENT)
59        #get fill value (if there is one)   
60        fillvalue=DI.getVariableAttribute('_FillValue')
61        if kwargs:
62            print 'subsetting'
63            data = DI.getSubsetOfDataForVar(**kwargs)
64        else:
65            print 'non subsetting'
66            data = DI.getDataForVar()
67        DC=DataContainer(data)
68        dataArray=DC.dataArray
69        units=[]
70        axisorder=DI.getVariableAxes()
71        for axis in axisorder:   
72            DI.setAxis(axis)
73            units.append(DI.getAxisAttribute('units'))
74    DI.closeFile()
75    return dataArray, fillvalue, axisorder, units
76       
77def getDataFromChunks(self, minIdx, maxIdx):
78    '''given a list of files of unknown length and an index range spanning some or all of those files, retuns the data from that index range. Only works with single dimensional data.'''
79    minIndex=minIdx
80    maxIndex=maxIdx
81    data=[]
82    totalarraylength = 0   
83    for file in self.fileList.fileNames.CONTENT.split():
84        DI=csml.csmllibs.csmldataiface.DataInterface()
85        DI=DI.getUnknownInterfaceType(file) 
86        DI.openFile(file)
87        DI.setVariable(self.variableName.CONTENT)
88        datachunk=DI.getDataForVar()                   
89        chunklength=len(datachunk)
90        startpoint=totalarraylength
91        totalarraylength=totalarraylength +chunklength
92               
93        if minIndex >= totalarraylength:
94            #print 'before selection, skipping %s'%file
95            continue
96       
97        elif minIndex < totalarraylength:
98            if minIndex >= startpoint:
99                sliceMin=minIndex-startpoint
100                #print 'selection starts in %s at index %s'%(file, sliceMin)
101                if maxIndex < totalarraylength:
102                    #print 'selection self contained in %s'%file
103                    sliceMax=sliceMin + (maxIndex-minIndex) +1
104                    data=datachunk[sliceMin:sliceMax]
105                    continue
106                else:
107                    #print 'selection goes beyond this file'
108                    data.append(datachunk[sliceMin: len(datachunk)])
109                    continue
110       
111        if maxIndex  < startpoint:
112            #print 'gone past end of selection, skipping %s'%file
113            continue
114        elif maxIndex >= totalarraylength:
115            #get the whole chunk
116            data.append(datachunk)
117            continue
118       
119        elif maxIndex <= totalarraylength:     
120            sliceMax=(maxIndex-startpoint) +1
121            data.append(datachunk[0:sliceMax])
122            continue   
123    fillvalue=DI.getVariableAttribute('_FillValue')
124    axisorder=DI.getVariableAxes()
125     
126    DI.closeFile()
127    try:
128        result=MA.concatenate(data)
129    except:
130        result =data
131    return result, fillvalue
132       
133def __calendar(file,timedim):
134    #open the file
135    DI = csmldataiface.DataInterface()
136    DI=DI.getUnknownInterfaceType(file)
137    DI.openFile(file)
138    DI.setAxis(timedim)
139    cal=DI.getAxisAttribute('calendar')
140    units=DI.getAxisAttribute('units')
141    return cal, units
142   
Note: See TracBrowser for help on using the repository browser.