Changeset 2473


Ignore:
Timestamp:
15/05/07 13:46:24 (12 years ago)
Author:
domlowe
Message:

merging PML code branch with trunk

Location:
TI02-CSML/trunk/csml
Files:
2 added
5 edited

Legend:

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

    r2305 r2473  
    77import ops_Dataset 
    88import ops_FileExtract 
     9import ops_RawFileExtract 
    910import ops_ArrayGenerator 
    1011import ops_AbstractFeature 
     
    2829#AbstractFileExtract methods: 
    2930addMethods(csml.parser.FileExtract, [ops_FileExtract.getData]) 
     31 
     32#RawFileExtract methods: 
     33addMethods(csml.parser.RawFileExtract, [ops_RawFileExtract.getData]) 
    3034 
    3135#ArrayGenerator methods: 
  • TI02-CSML/trunk/csml/API/genSubset.py

    r2444 r2473  
    9696        csml.csmllibs.csmltime.setcdtimeCalendar(caltype) 
    9797    except: 
    98         csml.csmllibs.csmltime.setcdtimeCalendar(csml.csmllibs.csmltime.cdtime.DefaultCalendar)         
     98        csml.csmllibs.csmltime.setcdtimeCalendar(csml.csmllibs.csmltime.cdtime.DefaultCalendar)       
     99        caltype='standard'   
    99100    return caltype 
    100101 
     
    132133    if hasattr(feature.value.rangeSet, 'valueArray'): 
    133134        if hasattr(feature.value.rangeSet.valueArray.valueComponent, 'insertedExtract'): 
    134             numFiles= len( csmlutils.listify(feature.value.rangeSet.valueArray.valueComponent.insertedExtract.components)[0].fileList.fileNames.CONTENT.split()) 
    135             return len(domain[timeName])/numFiles 
     135            try: 
     136                numFiles= len( csmlutils.listify(feature.value.rangeSet.valueArray.valueComponent.insertedExtract.components)[0].fileList.fileNames.CONTENT.split()) 
     137            except: 
     138                numFiles= len(csmlutils.listify(feature.value.rangeSet.valueArray.valueComponent.insertedExtract.components)[0].fileName.CONTENT) 
     139            timeToFileRatio= len(domain[timeName])/numFiles  
     140            if timeToFileRatio==0: 
     141                timeToFileRatio=None            
     142            return timeToFileRatio 
    136143 
    137144def getCoordTransformTable(domainSubset, crs, frame): 
     
    188195            if timeToFileRatio == None: 
    189196                filePos=None 
    190             else: 
     197            else:                 
    191198                filePos=int(float(listPosition)/timeToFileRatio) 
    192199            if filePos in filesFetched: 
  • TI02-CSML/trunk/csml/csmllibs/csmlcrs.py

    r2405 r2473  
    2020        self.systems={} 
    2121        self.pseudosystems={} 
     22         
     23        # define WGS84 CRS:         
     24        crs=CRSystem(srsName='WGS84', axes =['time', 'latitude','longitude']) 
     25        crs.lonAxis=2 
     26        crs.latAxis=1 
     27        crs.timeAxis=0 
     28        self.systems['WGS84']=crs 
    2229         
    2330        # define lon lat pressure time CRS:         
  • TI02-CSML/trunk/csml/csmllibs/csmldataiface.py

    r2444 r2473  
    1313import cdms  
    1414import Numeric 
     15 
    1516try: 
    1617    import nappy  
     
    2425import MA 
    2526MA.set_print_limit(0) 
     27 
     28# Generic mathematical expression solver, required by the raw and image 
     29# interfaces 
     30import NumericTransform 
     31 
     32try: 
     33    # Part of the PIL. Required for ImageFileInterface: 
     34    import Image 
     35except ImportError: 
     36    print 'could not import Image' 
     37    pass 
     38 
     39try: 
     40    # Required for RawFileInterface: 
     41    import struct 
     42except ImportError: 
     43    print 'could not import struct' 
     44    pass 
    2645 
    2746 
     
    4059                elif self.iface == 'cdunif': 
    4160                        return cdunifInterface() 
     61                elif self.iface == 'raw': 
     62                        return RawFileInterface() 
     63                elif self.iface == 'image': 
     64                        return ImageFileInterface() 
    4265                 
    4366                 
     
    4871                if fileExtension == '.nc': 
    4972                        return cdunifInterface() 
    50                 if fileExtension == '.qxf': 
     73                if fileExtension == '.qxf': 
    5174                        return cdunifInterface() 
    5275                elif fileExtension == '.pp': 
     
    5477                elif fileExtension == 'ctl': 
    5578                        return cdunifInterface() 
    56                 elif fileExtension == 'xml': 
     79                elif fileExtension == 'xml': 
    5780                        return cdmlInterface() 
     81                elif fileExtensions == 'png' or fileExtension == 'gif': 
     82                        return ImageFileInterface() 
    5883                else: 
    5984                        try: 
     
    504529        axisSize=self.file.axes[axis].length 
    505530        return axisSize 
     531 
     532 
     533class RawFileInterface(AbstractDI): 
     534 
     535   def __init__(self): 
     536      self.extractType   = 'rawExtract' 
     537      self.extractPrefix = '_rawextract_' 
     538 
     539 
     540   def openFile(self, filename): 
     541      self.file = open(filename, "rb") 
     542 
     543 
     544   def closeFile(self): 
     545      self.file.close() 
     546 
     547 
     548   # Read the data from the raw file into a multidimensional Numeric array 
     549   def readFile(self, **kwargs): 
     550      # Valid values for numericType and their associated struct format 
     551      # character: 
     552      numericLookup = { 
     553         'uint8':'B', 'uint16':'H', 'uint32':'I', 'uint64':'Q', 
     554          'int8':'b',  'int16':'h',  'int32':'i',  'int64':'q', 
     555         'float':'f', 'double':'d' 
     556      } 
     557 
     558      # Valid values for endianness and their associated struct format 
     559      # character: 
     560      endiannessLookup = { 
     561         'big':'>',  'little':'<',  'host':'=' 
     562      } 
     563 
     564      # Build the desired format string: 
     565      try: 
     566         format_str  = endiannessLookup[kwargs['endianness']] 
     567         format_str += str(reduce(lambda a,b:a*b, kwargs['dimensions'])) 
     568         format_str += numericLookup[kwargs['numericType']] 
     569      except KeyError, TypeError: 
     570         raise TypeError("Missing or invalid parameters. Required: endianness=str, dimensions=list and numericType=str") 
     571 
     572      # Read and unpack data into a Numeric array. 
     573      self.data = Numeric.array(struct.unpack(format_str, self.file.read())) 
     574      self.data.shape = tuple(map(int, kwargs['dimensions'])) 
     575       
     576      # If numericTransform or fillValue were provided, store them as  
     577      # attributes. 
     578      if 'numericTransform' in kwargs: 
     579         self.numericTransform = NumericTransform.infixExpression(kwargs['numericTransform']) 
     580      if 'fillValue' in kwargs: 
     581         self.fillValue = kwargs['fillValue'] 
     582 
     583 
     584   # Return the fill value, if set, and transform if necessary: 
     585   def getFillValue(self): 
     586      # Both fillValue and numericTransform attributes may or may 
     587      # not exist... 
     588      try: 
     589         return self.numericTransform.solve( n = float(self.fillValue) ) 
     590      except AttributeError: 
     591         try: 
     592            return self.fillValue 
     593         except AttributeError: 
     594            return None 
     595 
     596 
     597   # This is a just a special case of getSubsetOfDataForVar. To avoid 
     598   # duplication of code, just subset the entire array. (getSubset.. is 
     599   # optimised for this case) 
     600   def getDataForVar(self): 
     601      return self.getSubsetOfDataForVar(lower = (0,)*len(self.data.shape), 
     602                                        upper = self.data.shape) 
     603 
     604 
     605   # Subset the n-dimensional file based on array indices. Accepts parameters 
     606   # in the form of e.g. 
     607   # 
     608   # getSubsetOfDataForVar( lower=(0,0), upper=(1,2) ) 
     609   # 
     610   # Note: The rank of the required subset, must exactly match the 
     611   # rank of the original data: len(lower) == len(upper) == rank of file 
     612   # 
     613   def getSubsetOfDataForVar(self, **kwargs): 
     614      # Assume subset parameters are passed as: lower=(0,0) upper=(512,512) 
     615      if 'lower' not in kwargs or 'upper' not in kwargs: 
     616         # Have not specified any subset parameters that we recognise, so raise 
     617         # an exception: 
     618         raise NotImplementedError("Only supports subsetting with lower+upper array indices") 
     619      elif not len(kwargs['lower']) == len(kwargs['upper']) == len(self.data.shape): 
     620         # Rank of subset is not the same as rank of full data array. so raise 
     621         # an exception: 
     622         raise NotImplementedError("Only supports subsets of same rank as full dataset") 
     623      elif Numeric.sometrue(Numeric.greater(kwargs['upper'], self.data.shape)): 
     624         # Requested upper bound of subset is beyond the size of the the full 
     625         # data array, so raise an exception 
     626         raise IndexException("Subset out of range") 
     627      elif Numeric.sometrue(Numeric.less( kwargs['upper'], Numeric.zeros(len(self.data.shape)))): 
     628         # Requested lower bound of subset is beyond the size of the the full 
     629         # data array, so raise an exception 
     630         raise IndexException("Subset out of range") 
     631      elif Numeric.sometrue(Numeric.less_equal(kwargs['upper'], kwargs['lower'])): 
     632         # lower bound <= upper_bound for at least one dimension, so raise an 
     633         # exception 
     634         raise IndexException("Upper bound less than lower bound") 
     635      elif tuple(kwargs['lower']) == (0,)*len(self.data.shape) and tuple(kwargs['upper']) == self.data.shape: 
     636         # Special case of requested subset == entire data file. 
     637         subset = self.data 
     638      else: 
     639         # We are okay to subset. 
     640 
     641         # I cant see any nice (and speedy) way of subsetting a Numeric 
     642         # array of arbitrary rank without the use of eval. By doing it 
     643         # this way, we can make use of the (possible) acceleration provided 
     644         # by Numeric/NumPy. 
     645         slices = [] 
     646         for i in range(len(self.data.shape)): 
     647            lower = int(kwargs['lower'][i]) 
     648            upper = int(kwargs['upper'][i]) 
     649            slices.append(str(lower)+':'+str(upper)) 
     650         subset = eval("self.data["+','.join(slices)+"]") 
     651 
     652      # Attempt to perform the numericTransform on the data array, if we get 
     653      # AttributeError, it most likely means that numericTransform was not 
     654      # specified, so return the data as-is 
     655      try: 
     656         return self.numericTransform.solve( n = subset ) 
     657      except AttributeError: 
     658         return subset.copy() 
     659 
     660 
     661# Interface for reading data from image files. Requires PIL Image module. 
     662class ImageFileInterface(RawFileInterface): 
     663   def __init__(self): 
     664      self.extractType   = 'imageExtract' 
     665      self.extractPrefix = '_imageextract_' 
     666 
     667   def openFile(self, filename): 
     668      self.file = Image.open(filename) 
     669 
     670   def closeFile(self): 
     671      self.file = None #...Image does not seem to have a close() method. 
     672 
     673   def readFile(self, **kwargs): 
     674      # Convert the image to a Numeric array 
     675      self.data = Numeric.array(self.file.getdata()) 
     676 
     677      # The order of dimensions in Numeric arrays do not correspond with 
     678      # the order of dimensions in traditional image files, so we need to 
     679      # reverse the dimensions before shaping the array. 
     680      dimensions = map(int,self.file.size) 
     681      dimensions.reverse() 
     682      self.data.shape = tuple(dimensions) # self.data.shape = (Y,X) 
     683 
     684      if 'numericTransform' in kwargs: 
     685         # numericTransform was specified, so compile the expression: 
     686         self.numericTransform = NumericTransform.infixExpression(kwargs['numericTransform']) 
     687      if 'fillValue' in kwargs: 
     688         self.fillValue = kwargs['fillValue'] 
  • TI02-CSML/trunk/csml/parser.py

    r2444 r2473  
    10261026        csElement.__init__(self,**kwargs) 
    10271027 
     1028class RawFileExtract(FileExtract, csElement): 
     1029 
     1030   # Note: Unlike the other file extracts, this sets a self.dataInterface 
     1031   # attribute, which is used by the overridden getData to determine which 
     1032   # Data Interface is used to read the file. This is necessary because the 
     1033   # getUnknownDataInterface() method determines which DI to use based on 
     1034   # filename suffix (raw files could be called anything) or by inspecting 
     1035   # the file (raw files have no magic numbers or other markers that could 
     1036   # be used to unequivocally determine the file type). 
     1037   def __init__(self,**kwargs): 
     1038      FileExtract.__init__(self, **kwargs) 
     1039      elems=['endianness', 'fillValue'] 
     1040      addelems(self,elems) 
     1041      children={elems[0]:[CSML('endianness'), 'csString'],elems[1]:[CSML('fillValue'), 'csString']} 
     1042      addchildren(self,children) 
     1043      csElement.__init__(self,**kwargs) 
     1044      self.dataInterface = csml.csmllibs.csmldataiface.RawFileInterface 
     1045  
     1046class ImageFileExtract(RawFileExtract, csElement): 
     1047   def __init__(self,**kwargs): 
     1048      FileExtract.__init__(self, **kwargs) 
     1049      elems=['fillValue'] 
     1050      addelems(self,elems) 
     1051      children={elems[0]:[CSML('fillValue'), 'csString']} 
     1052      addchildren(self,children) 
     1053      csElement.__init__(self,**kwargs) 
     1054      self.dataInterface = csml.csmllibs.csmldataiface.ImageFileInterface 
     1055    
    10281056 
    10291057class SimpleCondition(csElement):  
     
    10721100        elems=['descriptors'] 
    10731101        addelems(self,elems) 
    1074         children={elems[0]:[[CSML('NetCDFExtract'),CSML('AggregatedArray')], 'FileExtract', CSML('descriptor'),1]} 
     1102        children={elems[0]:[[CSML('NetCDFExtract'),CSML('AggregatedArray'), CSML('RawFileExtract')], 'FileExtract', CSML('descriptor'),1]} 
    10751103        addchildren(self,children) 
    10761104        csElement.__init__(self,**kwargs) 
     
    11741202     
    11751203    print '\n' 
    1176     #tree=ET.ElementTree(file='testfiles/gridseries/testout.xml') 
    1177     tree=ET.ElementTree(file='testfiles/gridseries/securitytest.xml') 
     1204    tree=ET.ElementTree(file='../rsg_example_csml-2.0.xml') 
    11781205    ds=Dataset() 
    11791206    ds.fromXML(tree.getroot()) 
Note: See TracChangeset for help on using the changeset viewer.