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

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

used dictionary to store fileextract info that was getting read from disk each time

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    csml.API.csmlContainer.globalContainer.CACHE[self.id]=[dataArray, fillvalue, axisorder, units]
97   
98    return dataArray, fillvalue, axisorder, units
99       
100def getDataFromChunks(self, minIdx, maxIdx):
101    '''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.'''
102    minIndex=minIdx
103    maxIndex=maxIdx
104    if csml.API.csmlContainer.globalContainer.OUTPUTDIR is not None:
105        directory=csml.API.csmlContainer.globalContainer.OUTPUTDIR
106    else:
107        directory=None   
108    data=[]
109    totalarraylength = 0   
110    for file in self.fileList.fileNames.CONTENT.split():
111        DI=csml.csmllibs.csmldataiface.DataInterface()
112        DI=DI.getUnknownInterfaceType(file) 
113        try:
114            DI.openFile(file)
115        except:
116            if directory is not None:
117                file=directory +'/' + file
118                DI.openFile(file)
119        DI.setVariable(self.variableName.CONTENT)
120        datachunk=DI.getDataForVar()                   
121        chunklength=len(datachunk)
122        startpoint=totalarraylength
123        totalarraylength=totalarraylength +chunklength
124               
125        if minIndex >= totalarraylength:
126            #print 'before selection, skipping %s'%file
127            continue
128       
129        elif minIndex < totalarraylength:
130            if minIndex >= startpoint:
131                sliceMin=minIndex-startpoint
132                #print 'selection starts in %s at index %s'%(file, sliceMin)
133                if maxIndex < totalarraylength:
134                    #print 'selection self contained in %s'%file
135                    sliceMax=sliceMin + (maxIndex-minIndex) +1
136                    data=datachunk[sliceMin:sliceMax]
137                    continue
138                else:
139                    #print 'selection goes beyond this file'
140                    data.append(datachunk[sliceMin: len(datachunk)])
141                    continue
142       
143        if maxIndex  < startpoint:
144            #print 'gone past end of selection, skipping %s'%file
145            continue
146        elif maxIndex >= totalarraylength:
147            #get the whole chunk
148            data.append(datachunk)
149            continue
150       
151        elif maxIndex <= totalarraylength:     
152            sliceMax=(maxIndex-startpoint) +1
153            data.append(datachunk[0:sliceMax])
154            continue   
155    fillvalue=DI.getVariableAttribute('_FillValue')
156    axisorder=DI.getVariableAxes()
157     
158    DI.closeFile()
159    try:
160        result=MA.concatenate(data)
161    except:
162        result =data
163    return result, fillvalue
164       
165def __calendar(file,timedim):
166    #open the file
167    DI = csmldataiface.DataInterface()
168    DI=DI.getUnknownInterfaceType(file)
169    DI.openFile(file)
170    DI.setAxis(timedim)
171    cal=DI.getAxisAttribute('calendar')
172    units=DI.getAxisAttribute('units')
173    return cal, units
174   
Note: See TracBrowser for help on using the repository browser.