Changeset 1902 for TI02-CSML/branches


Ignore:
Timestamp:
20/12/06 15:43:32 (13 years ago)
Author:
domlowe
Message:

beginning to refactor API module

Location:
TI02-CSML/branches/CSML2
Files:
9 edited
1 moved

Legend:

Unmodified
Added
Removed
  • TI02-CSML/branches/CSML2/API/__init__.py

    r1738 r1902  
    1 #''' __init__.py  ''' 
     1''' __init__.py  ''' 
    22 
    33 
    4 ##import element tree and the parser api 
    5 #from cElementTree import * 
    6 #import csml.parser 
    7 #import ops_Dataset 
    8 #import ops_AbstractFileExtract 
    9 #import ops_ArrayGenerator 
    10 #import ops_AbstractFeature 
    11 #import ops_PointFeature 
    12 #import ops_PointSeriesFeature 
    13 #import ops_ProfileFeature 
    14 #import ops_ProfileSeriesFeature 
    15 #import ops_GridFeature 
    16 #import ops_GridSeriesFeature 
    17 #import ops_TrajectoryFeature 
    18 #import csmlContainer 
     4#import element tree and the parser api 
     5from cElementTree import * 
     6import csml.parser 
     7import ops_Dataset 
     8import ops_FileExtract 
     9import ops_ArrayGenerator 
     10import ops_AbstractFeature 
     11import ops_PointFeature 
     12import ops_PointSeriesFeature 
     13import ops_ProfileFeature 
     14import ops_ProfileSeriesFeature 
     15import ops_GridFeature 
     16import ops_GridSeriesFeature 
     17import ops_TrajectoryFeature 
     18import csmlContainer 
    1919 
    20 #def addMethods(obj, meths): 
    21     #for meth in meths: 
    22         #setattr(obj, meth.__name__, meth) 
     20def addMethods(obj, meths): 
     21    for meth in meths: 
     22        setattr(obj, meth.__name__, meth) 
    2323 
    24 ##Assign methods to parser classes 
    25 ##Dataset methods: 
    26 #addMethods(csml.parser.Dataset, [ops_Dataset.parse, ops_Dataset.getSecurity, ops_Dataset.getFeatureList, ops_Dataset.getFeature, ops_Dataset.getFileExtract]) 
     24#Assign methods to parser classes 
     25#Dataset methods: 
     26addMethods(csml.parser.Dataset, [ops_Dataset.parse, ops_Dataset.getSecurity, ops_Dataset.getFeatureList, ops_Dataset.getFeature, ops_Dataset.getFileExtract]) 
    2727 
    28 ##AbstractFileExtract methods: 
    29 #addMethods(csml.parser.AbstractFileExtract, [ops_AbstractFileExtract.getData]) 
     28#AbstractFileExtract methods: 
     29addMethods(csml.parser.FileExtract, [ops_FileExtract.getData]) 
    3030 
    31 ##ArrayGenerator methods: 
     31#ArrayGenerator methods: 
    3232#addMethods(csml.parser.ArrayGenerator, [ops_ArrayGenerator.getGeneratedValues]) 
    3333 
  • TI02-CSML/branches/CSML2/API/csmlContainer.py

    r1594 r1902  
    1919        #if 'metadata' is a URI, set it as href attribute if MetaDataProperty instance, 
    2020        #else set it as a text attribute of a MetaDataProperty instance. 
    21         mdp=csml.parser.MetaDataProperty() 
    22         if csml.parser_extra.isURI(metadata): 
    23             mdp.href=metadata 
    24         else:  
    25             mdp.text = [metadata] 
    26         self.ds.metaDataProperty= [mdp] 
     21        #commented out temporarily for now (V2 rewrite) 
     22        #TODO 
     23        #mdp=csml.parser.MetaDataProperty() 
     24        #if csml.parser_extra.isURI(metadata): 
     25            #mdp.href=metadata 
     26        #else:  
     27            #mdp.text = [metadata] 
     28        #self.ds.metaDataProperty= [mdp] 
    2729        #set the id 
    2830        self.ds.id=docID 
  • TI02-CSML/branches/CSML2/API/ops_Dataset.py

    r1490 r1902  
    4040    self.featureList = [] 
    4141    for member in self.featureCollection.members: 
     42            print dir(member) 
    4243            self.featureList.append(member.id) 
    4344    return self.featureList 
  • TI02-CSML/branches/CSML2/API/ops_GridSeriesFeature.py

    r1738 r1902  
    2020 
    2121def subsetToGridSeries(self,   csmlpath=None, ncpath=None,**kwargs): 
     22    #pathToSubsetCSML = container.csmlpath 
     23    if ncpath is not None: 
     24        pathToSubsetNetCDF=ncpath 
     25    else: 
     26        pathToSubsetNetCDF='temp.nc' 
     27     
     28    #deal with longitude requests 
     29    #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. 
     30    dc = self.getDomainComplement() 
     31    for key in dc.keys(): 
     32        if key == 'longitude': #how do we test if it is longitude properly? 
     33            for val in dc[key]: 
     34                if val < 0: 
     35                    pass 
     36                else: 
     37                    if kwargs[key][0] < 0: 
     38                        kwargs[key]=(kwargs[key][0]+360,kwargs[key][1]) 
     39                    if kwargs[key][1] < 0: 
     40                        kwargs[key]=(kwargs[key][0],kwargs[key][1]+360) 
     41          
     42    domainref = getDomainReference(self) 
     43    self.times=timeSubset 
     44    self.files=[] 
     45    strTimes='' 
     46    fulldata=[] 
     47    if len(self.times) == 2: 
     48        try: 
     49            tone=ops_AbstractFeature.__getCDtime(self.times[0]) 
     50        except: 
     51            tone=self.times[0] 
     52        try: 
     53            ttwo=ops_AbstractFeature.__getCDtime(self.times[1]) 
     54        except: 
     55            ttwo=self.times[1] 
     56        dr=getDomainReference(self) 
     57        self.times=[] 
     58        for time in dr['t'].split(): 
     59            timeok=csml.API.ops_AbstractFeature.__compareTimes(tone,time,ttwo) 
     60            if timeok ==1: 
     61                self.times.append(time) 
     62     
     63    #to keep track of files that have already been fetched. eg. if multiple times are in a single file only need to get data from that file once... 
     64    numFiles=len(self.rangeSet.aggregatedArray.component[0].fileName.split()) 
     65    timeToFileRatio=len(domainref['t'].split())/numFiles 
     66    filesFetched=[] 
     67    #get data: 
     68    for time in self.times: 
     69        listPosition=domainref['t'].split().index(time) 
     70        strTimes= strTimes + ' ' + time 
     71        timedim=self.rangeSet.aggregatedArray.component[0].variableName 
     72        for comp in self.rangeSet.aggregatedArray.component: 
     73            filePos=(listPosition)/timeToFileRatio 
     74            if filePos in filesFetched: 
     75                continue #already got data from this file, try next time 
     76            data=comp.getData(fileposition=filePos, times=self.times, **kwargs) 
     77            self.files.append(comp.fileName.split()[filePos]) 
     78            if fulldata ==[]: 
     79               fulldata = data.tolist() 
     80            else: 
     81                for item in data.tolist(): 
     82                    fulldata.append(item) 
     83            filesFetched.append(filePos) 
     84        axisorder = data.getAxisIds()  #will need later! 
     85    try: 
     86        caltype=self.domain.domainReference.frame.split(':',1)[0] 
     87        calunits=self.domain.domainReference.frame.split(':',1)[1] 
     88        csml.csmllibs.csmltime.setcdtimeCalendar(caltype) 
     89    except: 
     90        csml.csmllibs.csmltime.setcdtimeCalendar(csml.csmllibs.csmltime.cdtime.DefaultCalendar) 
     91    ### define domain and rangeSet to use for feature in csml document#### 
     92    domain=csml.parser.GridSeriesDomain() 
     93    domain.domainReference=csml.parser.TimePositionList(timePositions=strTimes) 
     94    grid=csml.parser.Grid() 
     95    #dc = self.getDomainComplement() 
     96    ordinates= [] 
     97    i=0 
     98    valueStore=[]  # use the values again later to generate netcdf 
     99    arraySize=0 
     100    totalArraySize=1 
     101    for key in dc.keys(): 
     102        arraySize=0 
     103        i=i+1 
     104        god=csml.parser.GridOrdinateDescription() 
     105        god.gridAxesSpanned='dim%s'%i 
     106        god.sequenceRule='+x+y+z' 
     107        god.definesAxis=key 
     108        straxisValues='' 
     109        #now deal with each argument: 
     110         
     111        if key in kwargs: 
     112            if kwargs[key][0] < kwargs[key][1]:    
     113                for val in dc[key]: 
     114                    if val is not '': 
     115                        if float(val) >= kwargs[key][0]: 
     116                            if float(val) <= kwargs[key] [1]: 
     117                                arraySize=arraySize+1 
     118                                straxisValues=straxisValues+ str(val) + ', ' 
     119            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. 
     120                    for val in dc[key]: 
     121                        if val is not '': 
     122                            if val >= kwargs[key][0]: 
     123                                arraySize=arraySize+1 
     124                                straxisValues=straxisValues+ str(val) + ', ' 
     125                    for val in dc[key]: 
     126                        if val is not '': 
     127                            if val <= kwargs[key] [1]: 
     128                                arraySize=arraySize+1 
     129                                straxisValues=straxisValues+ str(val) + ', ' 
     130        else: # this dimension has not been subsetted at all 
     131            for val in dc[key]: 
     132                if val is not '': 
     133                    arraySize=arraySize+1 
     134                    straxisValues=straxisValues+ str(val) + ', '         
     135        totalArraySize=totalArraySize*arraySize 
     136        god.axisValues=straxisValues[:-2] 
     137        ordinates.append(god) 
     138    totalArraySize=totalArraySize*len(self.times) 
     139    grid.ordinates=ordinates 
     140    domain.domainComplement=grid 
     141    rangeSet=csml.parser.RangeSet() 
     142    rangeSet.arrayDescriptor=csml.parser.NetCDFExtract(id=self.id,fileName=pathToSubsetNetCDF,variableName=self.id,arraySize=[arraySize]) 
     143 
     144    csmlWrap=csml.csmllibs.csmlfeaturewrap.CSMLWrapper() 
     145    subsettedFeature=csmlWrap.createGridSeriesFeature(domain,rangeSet,datasetID="A",featureID="B",description="C") 
     146    #container.appendFeature(subsettedFeature) 
     147 
     148    ### write netcdf using NCWriter class (wraps cdms) ### 
     149    nc=csml.csmllibs.netCDFWriter.NCwriter(pathToSubsetNetCDF) 
     150    floatTimes=[] 
     151    for time in self.times: 
     152        time=csml.API.ops_AbstractFeature.__getCDtime(time).torel(calunits) 
     153        floatTimes.append(time.value) 
     154    nc.addAxis('t',floatTimes,isTime=1,units=calunits,calendar=caltype) 
     155    for ordinate in ordinates: 
     156        lon,lat=None,None 
     157        if ordinate.definesAxis=='longitude': 
     158            lon=1 
     159        if ordinate.definesAxis=='latitude': 
     160            lat=1 
     161        #convert to list 
     162        vals=[] 
     163        for val in ordinate.axisValues.split(','): 
     164            vals.append(float(val)) 
     165        nc.addAxis(ordinate.definesAxis,vals,isLon=lon,isLat=lat,units='')#to do, units attribute for CF compliance 
     166    if len(ordinates)==3: 
     167        axes=['t',axisorder[1],axisorder[2],axisorder[3]] 
     168    elif len(grid.ordinates)==2: 
     169        axes=['t',axisorder[1],axisorder[2]] 
     170    nc.addVariable(fulldata,self.id, axes,units='') #to do, units attribute for CF compliance 
     171    nc.closeFinishedFile() 
     172    return subsettedFeature, pathToSubsetNetCDF 
     173    #container.attachNetCDFFile(nc) 
    22174    #MUST be supplied with a CSMLContainer object to store the subsetted feature in 
    23175    return subsettedFeature, pathToSubsetNetCDF 
    24     #container.attachNetCDFFile(nc) 
  • TI02-CSML/branches/CSML2/__init__.py

    r1887 r1902  
    22 
    33import csmllibs 
    4 #import API 
     4import API 
    55import parser 
    6 #import parser_extra 
     6import parser_extra 
    77 
    88 
  • TI02-CSML/branches/CSML2/csmllibs/csmlfeaturetypes.py

    r1900 r1902  
    120120            numFeatures=len(allVarNames) 
    121121            #Create a GridSeriesFeature for each variable: 
    122             print 'TEST CODE' 
    123                  
    124122            for i in range(0, numFeatures): 
    125123                DI.setVariable(allVarNames[i]) 
    126                 print allVarNames[i] 
    127                 #set up the axisList for use later 
    128                 AL=axisList() 
    129124                dimNames=DI.getVariableAxes()                 
    130125                if len(dimNames) <= 2: 
     
    136131                #GridSeriesFeature_element.description=csml.parser.Description(desc) 
    137132                gsFeature.description=desc 
    138                 #value (coverage) 
     133                #VALUE (coverage) 
    139134                gsCoverage=cp.GridSeriesCoverage() 
    140135                gsDomain=cp.GridSeriesDomain() 
    141136                gcT=cp.GridCoordinatesTable() 
    142                  
    143137                #add an axisName element(s) for  each spatial dimension. 
    144138                #and an ordinate element 
     
    183177                gsDomain.coordTransformTable=gcT 
    184178                gsCoverage.gridSeriesDomain=gsDomain 
     179                 
    185180                #COVERAGE FUNCTION 
    186181                mr =csml.csmllibs.csmlextra.getMappingRule(len(dimNames)) 
  • TI02-CSML/branches/CSML2/parser.py

    r1900 r1902  
    154154                self.CONTENT = csmlfrag.text 
    155155        for item in csmlfrag.items(): 
     156            print item 
    156157            if item[0] in self.ATTRIBUTES: 
    157158                setattr(self, item[0], item[1]) 
  • TI02-CSML/branches/CSML2/parser_extra.py

    r1737 r1902  
    9595    def __init__(self,dataset): 
    9696    #Needs rewriting for CSML v2    see V1original. 
     97        self.dataset=dataset 
    9798         
    98         return self.dataset 
     99    def resolveReferences(self): 
     100        pass 
     101        #   return self.dataset 
  • TI02-CSML/branches/CSML2/testfiles/apicalls.py

    r1901 r1902  
    33import csml 
    44 
    5 f='Examples/parsing/test.xml' 
     5f='csml/testfiles/testcoapec.xml' 
    66 
    77#Initialise the CSML container 
Note: See TracChangeset for help on using the changeset viewer.