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

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

more on subsetting trajectory

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