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

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

fixing ID/naming issues and paths

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        print DI.file
69        print DI.getListofVariables()
70       
71        DI.setVariable(self.variableName.CONTENT)
72        #get fill value (if there is one)   
73        fillvalue=DI.getVariableAttribute('_FillValue')
74        if kwargs:
75            print 'subsetting'
76            data = DI.getSubsetOfDataForVar(**kwargs)
77        else:
78            print 'non subsetting'
79            data = DI.getDataForVar()
80        DC=DataContainer(data)
81        dataArray=DC.dataArray
82        units=[]
83        axisorder=DI.getVariableAxes()
84        for axis in axisorder:   
85            DI.setAxis(axis)
86            units.append(DI.getAxisAttribute('units'))
87    DI.closeFile()
88    return dataArray, fillvalue, axisorder, units
89       
90def getDataFromChunks(self, minIdx, maxIdx):
91    '''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.'''
92    minIndex=minIdx
93    maxIndex=maxIdx
94    if csml.API.csmlContainer.globalContainer.OUTPUTDIR is not None:
95        directory=csml.API.csmlContainer.globalContainer.OUTPUTDIR
96    else:
97        directory=None   
98    data=[]
99    totalarraylength = 0   
100    for file in self.fileList.fileNames.CONTENT.split():
101        DI=csml.csmllibs.csmldataiface.DataInterface()
102        DI=DI.getUnknownInterfaceType(file) 
103        try:
104            DI.openFile(file)
105        except:
106            if directory is not None:
107                file=directory +'/' + file
108                DI.openFile(file)
109        DI.setVariable(self.variableName.CONTENT)
110        datachunk=DI.getDataForVar()                   
111        chunklength=len(datachunk)
112        startpoint=totalarraylength
113        totalarraylength=totalarraylength +chunklength
114               
115        if minIndex >= totalarraylength:
116            #print 'before selection, skipping %s'%file
117            continue
118       
119        elif minIndex < totalarraylength:
120            if minIndex >= startpoint:
121                sliceMin=minIndex-startpoint
122                #print 'selection starts in %s at index %s'%(file, sliceMin)
123                if maxIndex < totalarraylength:
124                    #print 'selection self contained in %s'%file
125                    sliceMax=sliceMin + (maxIndex-minIndex) +1
126                    data=datachunk[sliceMin:sliceMax]
127                    continue
128                else:
129                    #print 'selection goes beyond this file'
130                    data.append(datachunk[sliceMin: len(datachunk)])
131                    continue
132       
133        if maxIndex  < startpoint:
134            #print 'gone past end of selection, skipping %s'%file
135            continue
136        elif maxIndex >= totalarraylength:
137            #get the whole chunk
138            data.append(datachunk)
139            continue
140       
141        elif maxIndex <= totalarraylength:     
142            sliceMax=(maxIndex-startpoint) +1
143            data.append(datachunk[0:sliceMax])
144            continue   
145    fillvalue=DI.getVariableAttribute('_FillValue')
146    axisorder=DI.getVariableAxes()
147     
148    DI.closeFile()
149    try:
150        result=MA.concatenate(data)
151    except:
152        result =data
153    return result, fillvalue
154       
155def __calendar(file,timedim):
156    #open the file
157    DI = csmldataiface.DataInterface()
158    DI=DI.getUnknownInterfaceType(file)
159    DI.openFile(file)
160    DI.setAxis(timedim)
161    cal=DI.getAxisAttribute('calendar')
162    units=DI.getAxisAttribute('units')
163    return cal, units
164   
Note: See TracBrowser for help on using the repository browser.