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

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

added fix to check ordering of output axes, fixes latitude reversal problem

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