Changeset 2078 for TI02-CSML/trunk


Ignore:
Timestamp:
30/01/07 11:51:56 (13 years ago)
Author:
domlowe
Message:

subsetting working, but not complete

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

Legend:

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

    r2073 r2078  
    3434    return self.domain 
    3535 
     36def __subsetDomain(self,time=None,times=None,**kwargs): 
     37    #takes the domain and returns a subset according to the keyword selection criteria 
     38    strTimes=times 
     39    totalArraySize=0 
     40    subsetDomain={} 
     41    for key in self.domain.keys(): 
     42        arraySize=0 
     43        straxisValues='' 
     44        if key in kwargs: 
     45            if key ==time: 
     46                straxisValues=strTimes 
     47            elif kwargs[key][0] < kwargs[key][1]:    
     48                for val in self.domain[key]: 
     49                    if val is not '': 
     50                            if float(val) >= kwargs[key][0]: 
     51                                if float(val) <= kwargs[key] [1]: 
     52                                    arraySize=arraySize+1 
     53                                    straxisValues=straxisValues+ str(val) + ', ' 
     54            else:#this if deals with selections such as longitude (330,30) where the lower limit is 'greater' than the upper limit in a mathematical sense. 
     55                    for val in self.domain[key]: 
     56                        if val is not '': 
     57                            if val >= kwargs[key][0]: 
     58                                arraySize=arraySize+1 
     59                                straxisValues=straxisValues+ str(val) + ', ' 
     60                    for val in self.domain[key]: 
     61                        if val is not '': 
     62                            if val <= kwargs[key] [1]: 
     63                                arraySize=arraySize+1 
     64                                straxisValues=straxisValues+ str(val) + ', ' 
     65        else: # this dimension has not been subsetted at all 
     66            for val in self.domain[key]: 
     67                if val is not '': 
     68                    arraySize=arraySize+1 
     69                    straxisValues=straxisValues+ str(val) + ', '         
     70        totalArraySize=totalArraySize*arraySize 
     71        subsetDomain[key]=straxisValues 
     72    return subsetDomain, totalArraySize 
     73 
     74 
     75 
     76 
     77 
     78 
     79 
    3680def subsetToGridSeries(self, csmlpath=None, ncpath=None,**kwargs): 
    3781    #pathToSubsetCSML = container.csmlpath 
     
    4084    else: 
    4185        pathToSubsetNetCDF='temp.nc' 
    42      
     86         
    4387    self.getDomain() 
     88     
     89    #Now get the data subset: 
    4490     
    4591    #TODO - incoporate the crsCatalogue. into this 
     
    4793    #if the request is in -ve,+ve eg (-30,30) but the data is in (0,360) need to handle this by changing the args. 
    4894    kwargs=csmlutils.fixLongitude(self.domain,kwargs) 
    49      
    5095    #deal with times    
    5196    #need to find the time axis: 
     
    109154            if timeok ==1: 
    110155                self.times.append(time) 
    111      #okay up to here! 
    112156     
    113157    if hasattr(self.value.rangeSet, 'valueArray'): 
     
    120164            #get data: 
    121165            selection={} 
     166             
    122167            for kw in kwargs: 
    123                         if kw != timeAxis: 
    124                             selection[kw]=kwargs[kw] 
     168                if kw != timeName: 
     169                    selection[kw]=kwargs[kw] 
     170                else: 
     171                    selection[timeAxis]=kwargs[kw] 
     172              
    125173            for time in self.times: 
    126174                listPosition=self.domain[timeName].index(time) 
     
    138186                        for item in data.tolist(): 
    139187                            fulldata.append(item) 
     188                    
    140189                    filesFetched.append(filePos) 
    141190                axisorder = data.getAxisIds()  #will need later! 
    142191    elif hasattr(self.value.rangeSet, 'datablock'): #not tested 
    143192        pass 
    144  
     193     
     194    #Okay, got the data now. Need to write out CSML and NetCDF files... 
    145195  
    146196 
    147     # define domain  to use in 'value' attribute of feature in csml document# 
    148      
     197    #Writing out the CSML file 
     198    # define domain/coverage  to use in 'value' attribute    
    149199     
    150200    domain=csml.parser.GridSeriesDomain() 
    151201    grid=csml.parser.GridCoordinatesTable() 
    152     #dc = self.getDomainComplement() 
    153     ordinates= [] 
    154     i=0 
    155     valueStore=[]  # use the values again later to generate netcdf 
    156     arraySize=0 
    157     totalArraySize=1 
    158     for key in self.domain.keys(): 
    159         arraySize=0 
    160         i=i+1 
    161         god=csml.parser.GridOrdinateDescription() 
    162         god.gridAxesSpanned='dim%s'%i 
    163         god.sequenceRule='+x+y+z' 
    164         god.definesAxis=key 
    165         straxisValues='' 
    166         #now deal with each argument: 
    167     
    168         if key in kwargs: 
    169             if key ==timeName: 
    170                 straxisValues=strTimes 
    171             elif kwargs[key][0] < kwargs[key][1]:    
    172                 for val in self.domain[key]: 
    173                     if val is not '': 
    174                             if float(val) >= kwargs[key][0]: 
    175                                 if float(val) <= kwargs[key] [1]: 
    176                                     arraySize=arraySize+1 
    177                                     straxisValues=straxisValues+ str(val) + ', ' 
    178             else:#this if deals with selections such as longitude (330,30) where the lower limit is 'greater' than the upper limit in a mathematical sense. 
    179                     for val in self.domain[key]: 
    180                         if val is not '': 
    181                             if val >= kwargs[key][0]: 
    182                                 arraySize=arraySize+1 
    183                                 straxisValues=straxisValues+ str(val) + ', ' 
    184                     for val in self.domain[key]: 
    185                         if val is not '': 
    186                             if val <= kwargs[key] [1]: 
    187                                 arraySize=arraySize+1 
    188                                 straxisValues=straxisValues+ str(val) + ', ' 
    189         else: # this dimension has not been subsetted at all 
    190             for val in self.domain[key]: 
    191                 if val is not '': 
    192                     arraySize=arraySize+1 
    193                     straxisValues=straxisValues+ str(val) + ', '         
    194         totalArraySize=totalArraySize*arraySize 
    195         god.axisValues=straxisValues[:-2] 
    196         ordinates.append(god) 
    197     totalArraySize=totalArraySize*len(self.times) 
    198     grid.ordinates=ordinates 
    199     domain.domainComplement=grid 
     202    domainSubset, totalArraySize=__subsetDomain(self, time=timeName,times=strTimes,**kwargs) 
     203    cTT=csml.parser.GridCoordinatesTable() 
     204    ords =[] 
     205    for key in domainSubset.keys(): 
     206        go=csml.parser.GridOrdinateDescription() 
     207        go.coordAxisLabel=csml.parser.csString(key) 
     208        go.gridAxesSpanned=csml.parser.csString(key) 
     209        go.coordAxisValues = csml.parser.SpatialOrTemporalPositionList() 
     210        if key==crs.axes[crs.timeAxis]: 
     211            go.coordAxisValues.timePositionList=csml.parser.csString(domainSubset[key]) #self.domain.key placeholder 
     212        else: 
     213            go.coordAxisValues.coordinateList=csml.parser.csString(domainSubset[key]) #self.domain.key placeholder 
     214        ords.append(go) #go needs a few more properties setting 
     215    cTT.gridOrdinates=ords 
     216    grid=self.value.gridSeriesDomain.coordTransformTable 
     217    domain.coordTransformTable=cTT 
    200218    rangeSet=csml.parser.RangeSet() 
    201     rangeSet.arrayDescriptor=csml.parser.NetCDFExtract(id=self.id,fileName=csml.parser.csString(pathToSubsetNetCDF),variableName=csml.parser.csString(self.id),arraySize=csml.parser.csString(arraySize)) 
     219    rangeSet.arrayDescriptor=csml.parser.NetCDFExtract(id=self.id,fileName=csml.parser.csString(pathToSubsetNetCDF),variableName=csml.parser.csString(self.id),arraySize=csml.parser.csString(totalArraySize)) 
    202220    cvg=csml.parser.GridSeriesCoverage() 
    203221    cvg.rangeSet=rangeSet 
     
    205223    csmlWrap=csml.csmllibs.csmlfeaturewrap.CSMLWrapper() 
    206224    subsettedFeature=csmlWrap.createGridSeriesFeature(value=cvg,datasetID="A",featureID="B",description="C") 
    207      
    208      
     225    
    209226     
    210227    ### write netcdf using NCWriter class (wraps cdms) ### 
     
    215232        floatTimes.append(time.value) 
    216233    nc.addAxis('t',floatTimes,isTime=1,units=calunits,calendar=caltype) 
    217     #USE CRS!     
    218     for ordinate in ordinates: 
    219         if ordinate.definesAxis=='Time': 
     234    for ord in ords: 
     235        vals=[] 
     236        lon,lat=None,None 
     237        if ord.coordAxisLabel.CONTENT=='Time': 
    220238            continue 
    221         lon,lat=None,None 
    222         if ordinate.definesAxis=='Lon': 
     239        else: 
     240            for val in ord.coordAxisValues.coordinateList.CONTENT.split(','): 
     241                if val != ' ': 
     242                    vals.append(float(val))   
     243        if ord.coordAxisLabel.CONTENT=='Lon': 
    223244            lon=1 
    224         if ordinate.definesAxis=='Lat': 
     245            name='longitude' 
     246        elif ord.coordAxisLabel.CONTENT=='Lat': 
    225247            lat=1 
    226         #convert to list 
    227         vals=[] 
    228         for val in ordinate.axisValues.split(','): 
    229             vals.append(float(val)) 
    230         nc.addAxis(ordinate.definesAxis,vals,isLon=lon,isLat=lat,units='')#to do, units attribute for CF compliance 
    231     if len(ordinates)==3: 
     248            name='latitude' 
     249        else: 
     250            name=ord.coordAxisLabel.CONTENT 
     251        #convert to list             
     252        nc.addAxis(name,vals,isLon=lon,isLat=lat,units='')#to do, units attribute for CF compliance 
     253    if len(ords)==3: 
    232254        axes=['t',axisorder[0],axisorder[1],axisorder[2]] 
    233     elif len(ordinates)==2: 
     255    elif len(ords)==2: 
    234256        axes=['t',axisorder[0],axisorder[1]] 
    235257    nc.addVariable(fulldata,self.id, axes,units='') #to do, units attribute for CF compliance 
  • TI02-CSML/trunk/csml/csmllibs/csmldataiface.py

    r2061 r2078  
    428428        if subset==None: 
    429429            sel=cdms.selectors.Selector(**kwargs) 
     430            print sel 
    430431            subset=self.file(self.varobj.id,sel) 
     432             
    431433        data = subset 
    432434        return data 
  • TI02-CSML/trunk/csml/csmllibs/netCDFWriter.py

    r1488 r2078  
    1313    def addAxis(self,axisName, data,isLon=None,isLat=None,isTime=None,**kwargs): 
    1414        # Now create the axis 
     15        print axisName 
    1516        dataarray=MV.array(data) 
    1617        ax=cdms.createAxis(dataarray) 
Note: See TracChangeset for help on using the changeset viewer.