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

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

better handling of arrays to speed up subsetting

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    if csml.API.csmlContainer.globalContainer.OUTPUTDIR is not None:
33        directory=csml.API.csmlContainer.globalContainer.OUTPUTDIR
34    else:
35        directory=None 
36       
37       
38    #if fileposition is None, then this may be stored in the cache already.
39    try:
40        [dataArray, fillvalue, axisorder, units]=csml.API.csmlContainer.globalContainer.CACHE[self.id]
41        return dataArray, fillvalue, axisorder, units
42    except:
43        pass
44   
45    #file position defines the position of the filename if a list of filenames exists
46    #**kwargs can hold subsetting request.
47    #get the right file  ##TO DO< check this is ok with FILE LIST
48       
49    # TODO - cannot subset times within an individual file - no way to determine the original time crs..
50   
51    if fileposition is not None:
52        try:
53            file =self.fileList.fileNames.CONTENT.split()[fileposition]
54        except:
55            file=self.fileName.CONTENT
56    else:
57        file=self.fileName.CONTENT
58    #open the file
59    DI = csml.csmllibs.csmldataiface.DataInterface()
60    DI=DI.getUnknownInterfaceType(file)
61    try:
62        DI.openFile(file)
63    except:
64        if directory is not None:
65            file=directory +'/' + file
66            DI.openFile(file)
67    DI.setAxis(self.variableName.CONTENT)
68    try:
69        DI.setAxis(self.variableName.CONTENT)
70        data=DI.getDataForAxis()
71        dataArray=data
72        fillvalue=None
73        axisorder=None
74        units=None
75    except:
76        pass
77        DI.setVariable(self.variableName.CONTENT)
78        #get fill value (if there is one)   
79        fillvalue=DI.getVariableAttribute('_FillValue')
80        if kwargs:
81            print 'subsetting'
82            data = DI.getSubsetOfDataForVar(**kwargs)
83        else:
84            print 'non subsetting'
85            data = DI.getDataForVar()
86        DC=DataContainer(data)
87        dataArray=DC.dataArray
88        units=[]
89        axisorder=DI.getVariableAxes()
90        for axis in axisorder:   
91            DI.setAxis(axis)
92            units.append(DI.getAxisAttribute('units'))
93    DI.closeFile()
94   
95    #if fileposition is none, add to cache for retrieval by id later:
96    try:
97        csml.API.csmlContainer.globalContainer.CACHE[self.id]=[dataArray, fillvalue, axisorder, units]
98    except:
99        pass
100    return dataArray, fillvalue, axisorder, units
101       
102def getDataFromChunks(self, minIdx, maxIdx):
103    '''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.'''
104   
105    minIndex=minIdx
106    maxIndex=maxIdx
107    if csml.API.csmlContainer.globalContainer.OUTPUTDIR is not None:
108        directory=csml.API.csmlContainer.globalContainer.OUTPUTDIR
109    else:
110        directory=None   
111    data=[]
112    totalarraylength = 0   
113    filenames=[]
114    try:
115        for file in self.fileList.fileNames.CONTENT.split():
116            filenames.append[file]
117    except:
118        filenames.append(self.fileName.CONTENT)
119   
120    for file in filenames:
121        DI=csml.csmllibs.csmldataiface.DataInterface()
122        DI=DI.getUnknownInterfaceType(file) 
123        try:
124            DI.openFile(file)
125        except:
126            if directory is not None:
127                file=directory +'/' + file
128                DI.openFile(file)
129        DI.setVariable(self.variableName.CONTENT)
130        datachunk=DI.getDataForVar()                   
131        chunklength=len(datachunk)
132        startpoint=totalarraylength
133        totalarraylength=totalarraylength +chunklength
134               
135        if minIndex >= totalarraylength:
136            #print 'before selection, skipping %s'%file
137            continue
138       
139        elif minIndex < totalarraylength:
140            if minIndex >= startpoint:
141                sliceMin=minIndex-startpoint
142                #print 'selection starts in %s at index %s'%(file, sliceMin)
143                if maxIndex < totalarraylength:
144                    #print 'selection self contained in %s'%file
145                    sliceMax=sliceMin + (maxIndex-minIndex) +1
146                    data=datachunk[sliceMin:sliceMax]
147                    continue
148                else:
149                    #print 'selection goes beyond this file'
150                    data.append(datachunk[sliceMin: len(datachunk)])
151                    continue
152       
153        if maxIndex  < startpoint:
154            #print 'gone past end of selection, skipping %s'%file
155            continue
156        elif maxIndex >= totalarraylength:
157            #get the whole chunk
158            data.append(datachunk)
159            continue
160       
161        elif maxIndex <= totalarraylength:     
162            sliceMax=(maxIndex-startpoint) +1
163            data.append(datachunk[0:sliceMax])
164            continue   
165    fillvalue=DI.getVariableAttribute('_FillValue')
166    axisorder=DI.getVariableAxes()
167     
168    DI.closeFile()
169    if type(data) is MA.MA.MaskedArray:
170        result =data
171    else:
172        result=MA.concatenate(data)
173    #try:
174        #result=MA.concatenate(data)
175    #except:
176        #result =data
177    return result, fillvalue
178       
179def __calendar(file,timedim):
180    #open the file
181    DI = csmldataiface.DataInterface()
182    DI=DI.getUnknownInterfaceType(file)
183    DI.openFile(file)
184    DI.setAxis(timedim)
185    cal=DI.getAxisAttribute('calendar')
186    units=DI.getAxisAttribute('units')
187    return cal, units
188   
Note: See TracBrowser for help on using the repository browser.