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

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

added in try except

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