Changeset 2774


Ignore:
Timestamp:
07/08/07 15:09:48 (12 years ago)
Author:
domlowe
Message:

better handling of arrays to speed up subsetting

Location:
TI02-CSML/trunk/csml/API
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/trunk/csml/API/csmlContainer.py

    r2767 r2774  
    6868        #featureplusfileplusdescriptor should be a feature, and a filepath to the netcdf file, and a storage descriptor 
    6969        self.appendFeature(featureplusfileplusdescriptor[0]) 
    70         self.attachNetCDFFile(featureplusfileplusdescriptor[1]) 
    71         self.attachDescriptor(featureplusfileplusdescriptor[2]) 
     70        self.attachNetCDFFile(featureplusfileplusdescriptor[1])        
     71        #handle multiple descriptors: 
     72        if type(featureplusfileplusdescriptor[2]) is list: 
     73            for item in featureplusfileplusdescriptor[2]: 
     74                self.attachDescriptor(item) 
     75        else: 
     76            self.attachDescriptor(featureplusfileplusdescriptor[2]) 
    7277         
    7378    
  • TI02-CSML/trunk/csml/API/ops_FileExtract.py

    r2761 r2774  
    102102def getDataFromChunks(self, minIdx, maxIdx): 
    103103    '''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     
    104105    minIndex=minIdx 
    105106    maxIndex=maxIdx 
     
    166167       
    167168    DI.closeFile() 
    168     try: 
     169    if type(data) is MA.MA.MaskedArray: 
     170        result =data 
     171    else: 
    169172        result=MA.concatenate(data) 
    170     except: 
    171         result =data 
     173    #try: 
     174        #result=MA.concatenate(data) 
     175    #except: 
     176        #result =data 
    172177    return result, fillvalue 
    173178         
  • TI02-CSML/trunk/csml/API/ops_TrajectoryFeature.py

    r2767 r2774  
    3636    return self.domain     
    3737 
     38def _writeNetCDF(self): 
     39    #Now open a new NetCDF File:    
     40    nc=cdms.open(self.pathToSubsetNetCDF,'w') 
     41     
     42    #create the variable 
     43    var=MV.array(self.data) 
     44    var.id=self.name.CONTENT 
     45    var.name=self.name.CONTENT 
     46    var.units=self.units[0] # hopefully there is just one unit in this list.. 
     47 
     48    
     49    #create the time axis 
     50    floatTimes=[] 
     51    tOne=csml.csmllibs.csmltime.getCDtime(self.selectedTimes[0]) 
     52    tbase=csml.csmllibs.csmltime.getBaseUnits(tOne) 
     53    for time in self.selectedTimes: 
     54        time=csml.csmllibs.csmltime.getCDtime(time).torel(tbase) 
     55        floatTimes.append(time.value) 
     56    timeAx=cdms.createAxis(floatTimes) 
     57    timeAx.designateTime() 
     58    timeAx.id='time' 
     59    timeAx.standard_name='time' 
     60    timeAx.units=tbase   
     61    var.setAxis(0,timeAx)       
     62    nc.write(var) 
     63     
     64     
     65    #get standard_name table 
     66    sntable=csml.csmllibs.standardnames.__path__[0]+'/cf-standard-name-table.xml' 
     67    snt=csml.csmllibs.standardnames.snames.StandardNameTable(tablelocation=sntable) 
     68     
     69    #add auxiliary coordinate variables to hold the locations 
     70    for ax in self.spatialAxes: 
     71        var=MV.array(self.spatialAxes[ax]) 
     72        var.id=ax 
     73        #if id is standard_name, use it as a standard_name         
     74        if snt.lookup(ax) is 1: 
     75            var.standard_name=ax 
     76        var.setAxis(0,timeAx) 
     77        nc.write(var)     
     78                 
     79     
     80    nc.close()    
     81    print 'NetCDF file written to %s'%self.pathToSubsetNetCDF 
     82 
    3883    
    3984def subsetToTrajectory(self, outputdir=None, ncname='trajectory.nc' ,times=None, **kwargs): 
     
    4792       
    4893    if self.outputdir is not None: 
    49         pathToSubsetNetCDF=self.outputdir + '/' +ncname 
     94        self.pathToSubsetNetCDF=self.outputdir + '/' +ncname 
    5095    else:  
    51         pathToSubsetNetCDF=ncname 
     96        self.pathToSubsetNetCDF=ncname 
    5297    if self.outputdir is not None: 
    5398        csml.csmllibs.csmlextra.checkDirExists(self.outputdir) 
     99   
    54100   
    55101    #make sure single time string is converted to a tuple 
     
    58104    else: 
    59105        selection = times   
    60         
    61          
     106       
    62107    #repurpose the existing trajectoryDomain for the output csml. 
    63108    td=copy.deepcopy(self.value.trajectoryDomain) 
     
    71116                tlist.append(val)        
    72117            indices=[] 
     118            if selection is None: 
     119                #select all times 
     120                selection=[tlist[0], tlist[len(tlist)-1]] 
    73121            if  len(selection) ==2:        
    74                 selectedTimes=[] 
     122                self.selectedTimes=[] 
    75123                for domaintime in tlist: 
    76124                    if selection[0] == domaintime: 
    77125                        minIndex=tlist.index(domaintime) 
    78                         selectedTimes.append(domaintime) 
     126                        self.selectedTimes.append(domaintime) 
    79127                    if domaintime > selection[0]: 
    80128                        if domaintime < selection[1]: 
    81                             selectedTimes.append(domaintime)           
     129                            self.selectedTimes.append(domaintime)           
    82130                    if selection[1] == domaintime: 
    83131                        maxIndex=tlist.index(domaintime) 
    84                         selectedTimes.append(domaintime)           
    85                         break    
    86                              
     132                        self.selectedTimes.append(domaintime)           
     133                        break                               
    87134            elif len(selection)==1:   #point only 
    88135                for domaintime in tlist: 
     
    90137                        minIndex=tlist.index(domaintime) 
    91138                        maxIndex=minIndex 
    92                         selectedTimes=selection 
     139                        self.selectedTimes=selection 
    93140                        break 
    94             if len(selectedTimes) ==1: 
    95                 timestr=selectedTimes[0] 
     141            if len(self.selectedTimes) ==1: 
     142                timestr=self.selectedTimes[0] 
    96143            else: 
    97                 timestr='' 
    98                 for t in selectedTimes: 
    99                     timestr = timestr + ' ' + t 
     144                timestr='  '.join(self.selectedTimes)   
    100145            #now substitute these times into the feature as we will use it later to write out a new feature. 
    101146            gridOrd.coordAxisValues.timePositionList=csml.parser.csString(timestr) 
     
    106151    highlim='' 
    107152    for item in td.limits.high.CONTENT.split(): 
    108         highlim=highlim+ ' ' + str(len(selectedTimes)-1) 
     153        highlim=highlim+ ' ' + str(len(self.selectedTimes)-1) 
    109154    td.limits.high.CONTENT=highlim     
    110      
    111155    #Now get the data from the spatial axes using the indices 
    112     spatialAxes={} 
     156    self.spatialAxes={} 
    113157    for gridOrd in td.coordTransformTable.gridOrdinates: 
    114158        if hasattr(gridOrd.coordAxisValues, 'coordinateList'): 
    115             data, fillvalue=gridOrd.coordAxisValues.insertedExtract.getDataFromChunks(minIndex, maxIndex) 
     159            if hasattr(gridOrd.coordAxisValues, 'insertedExtract'): 
     160                data, fillvalue=gridOrd.coordAxisValues.insertedExtract.getDataFromChunks(minIndex, maxIndex) 
     161            else: 
     162                data=gridOrd.coordAxisValues.CONTENT 
    116163            if len(data)==1: 
    117164                datastr=data[0] 
    118             else: 
    119                 datastr='' 
    120                 for d in data: 
    121                     datastr=datastr + ' ' + str(d) 
     165            else:         
     166                datastr = data.tostring() 
    122167            gridOrd.coordAxisValues.coordinateList=csml.parser.csString(datastr) 
    123168            gridOrd.coordAxisValues.id = csml.csmllibs.csmlextra.getRandomID() 
    124             spatialAxes[gridOrd.coordAxisLabel.CONTENT]=data         
     169            self.spatialAxes[gridOrd.coordAxisLabel.CONTENT]=data         
    125170             
    126171            #get rid of the old xlink attributes 
    127             delattr(gridOrd.coordAxisValues, 'href') 
    128             delattr(gridOrd.coordAxisValues, 'role') 
    129             delattr(gridOrd.coordAxisValues, 'arcrole') 
    130             delattr(gridOrd.coordAxisValues, 'show') 
    131             delattr(gridOrd.coordAxisValues, '{http://www.w3.org/1999/xlink}href') 
    132             delattr(gridOrd.coordAxisValues, '{http://www.w3.org/1999/xlink}role') 
    133             delattr(gridOrd.coordAxisValues, '{http://www.w3.org/1999/xlink}arcrole') 
    134             delattr(gridOrd.coordAxisValues, '{http://www.w3.org/1999/xlink}show') 
    135  
    136              
    137              
     172            for att in [ 'href', 'role', 'arcrole', 'show','{http://www.w3.org/1999/xlink}href', '{http://www.w3.org/1999/xlink}role', '{http://www.w3.org/1999/xlink}arcrole', '{http://www.w3.org/1999/xlink}show']: 
     173                try: 
     174                    delattr(gridOrd.coordAxisValues, att) 
     175                except: 
     176                    pass 
     177     
     178    #now get the actual rangeset data 
     179    if hasattr(self.value.rangeSet.valueArray.valueComponent, 'insertedExtract'): 
     180        self.data,self.fillvalue=self.value.rangeSet.valueArray.valueComponent.insertedExtract.getDataFromChunks(minIndex, maxIndex) 
     181    else: 
     182        print 'warning: inline rangeset not implemented' 
     183 
     184    
    138185    #Now create the file extract 
    139186    fileList=[] 
     
    141188        fileList.append(self.value.rangeSet.valueArray.valueComponent.insertedExtract.fileName.CONTENT) 
    142189        fextract=self.value.rangeSet.valueArray.valueComponent.insertedExtract 
    143         units=self.value.rangeSet.valueArray.valueComponent.uom 
     190        self.units=self.value.rangeSet.valueArray.valueComponent.uom 
    144191    except: 
    145192        for f in self.value.rangeSet.arrayDescriptor.components.fileList.fileNames.CONTENT.split(): 
    146193            fileList.append(f) 
    147194            fextract=self.value.rangeSet.arrayDescriptor.components 
    148             units= self.value.rangeSet.arrayDescriptor.uom.CONTENT 
    149      
     195            self.units= self.value.rangeSet.arrayDescriptor.uom.CONTENT 
    150196    #Now write out the CSML Feature: 
    151197    #create a TrajectoryCoverage 
     
    188234    subsettedFeature=csmlWrap.createTrajectoryFeature(value=cvg,parameter=param,featureID=csml.csmllibs.csmlextra.getRandomID(),description=self.description) 
    189235     
    190        
    191      
    192     #Now open a new NetCDF File:    
    193     nc=cdms.open(pathToSubsetNetCDF,'w') 
    194      
    195     #create the variable 
    196     var=MV.array(data) 
    197     var.id=self.name.CONTENT 
    198     var.name=self.name.CONTENT 
    199     var.units=units[0] # hopefully there is just one unit in this list.. 
    200  
    201     
    202     #create the time axis 
    203     floatTimes=[] 
    204     tOne=csml.csmllibs.csmltime.getCDtime(selection[0]) 
    205     tbase=csml.csmllibs.csmltime.getBaseUnits(tOne) 
    206     for time in selectedTimes: 
    207         time=csml.csmllibs.csmltime.getCDtime(time).torel(tbase) 
    208         floatTimes.append(time.value) 
    209     timeAx=cdms.createAxis(floatTimes) 
    210     timeAx.designateTime() 
    211     timeAx.id='time' 
    212     timeAx.standard_name='time' 
    213     timeAx.units=tbase   
    214     var.setAxis(0,timeAx)       
    215     nc.write(var) 
    216      
    217      
    218     #get standard_name table 
    219     sntable=csml.csmllibs.standardnames.__path__[0]+'/cf-standard-name-table.xml' 
    220     snt=csml.csmllibs.standardnames.snames.StandardNameTable(tablelocation=sntable) 
    221      
    222     #add auxiliary coordinate variables to hold the locations 
    223     for ax in spatialAxes: 
    224         var=MV.array(spatialAxes[ax]) 
    225         var.id=ax 
    226         #if id is standard_name, use it as a standard_name         
    227         if snt.lookup(ax) is 1: 
    228             var.standard_name=ax 
    229         var.setAxis(0,timeAx) 
    230         nc.write(var)     
    231                  
    232      
    233     nc.close()    
    234     print 'NetCDF file written to %s'%pathToSubsetNetCDF 
    235     return subsettedFeature, pathToSubsetNetCDF, descriptor 
    236  
    237     
    238     
     236    self._writeNetCDF() 
     237     
     238 
     239    return subsettedFeature, self.pathToSubsetNetCDF, descriptor 
     240 
     241    
     242    
Note: See TracChangeset for help on using the changeset viewer.