def check_variables(self):
        """
        Forces variables to respect dimensions
        """
        
        self.count = len(self.fileid)
        self.size = np.size([np.size(self.__dict__.get(par)) for par in self.par_list])
        
        infos = zip(*(self.par_list.tolist(),self.dim_list.tolist()))
#        curDim, nself = self.get_currentDim()
        
        for enum in enumerate(infos):
            varSize = np.size(self.__dict__.get(enum[1][0]))
            varShape = np.shape(self.__dict__.get(enum[1][0]))[::-1] #Data and Netcdf dimensions are inverted (not allways?)
            
            dimSize = None
            if hasattr(self.__dict__.get(enum[1][0]),'_dimensions') :
                dumDim = self.__dict__.get(enum[1][0])._dimensions
                dumDim.pop('_ndims')
                dimSize = tuple(dumDim.values())
            elif isinstance(self.__dict__.get(enum[1][0]),dict):
                if self.__dict__.get(enum[1][0]).has_key('_dimensions'):
                    dumDim = self.__dict__.get(enum[1][0])['_dimensions']
                    dumDim.pop('_ndims')
                    dimSize = tuple(dumDim.values())
            
            if dimSize is None :
                if isinstance(self._dimensions,dimStr) :
                    dimSize = (self._dimensions).get(enum[1][1])
                else :
                    dimSize = tuple([(self._dimensions).get([d]) for d in enum[1][1]])
                
            masked = isinstance(self.__dict__.get(enum[1][0]), np.ma.masked_array)
            
            #Check mask consistency (mask length should be the same as data)
            if masked :
                if (self.__dict__.get(enum[1][0]).mask.size != self.__dict__.get(enum[1][0]).data.size): raise np.ma.core.MaskError("Mask length is not consistent with data")
            
            #Check dimensions
            self.message(4, 'checking variables -> {0}(N={1}) - {2}:{3}'.format(enum[1][0],varSize,enum[1][1],dimSize))
            for n,sh in enumerate(varShape) :
                if (sh > dimSize[n]) :
                    self.Error('Object variable {0} greater than corresponding dimension ({1})'.format(enum[1][0],enum[1][1]))
                elif (sh < dimSize[n]):
                    self.message(3, 'Variable {0}(N={1}) being extended to match dimension {2}:{3}'.format(enum[1][0],varSize,enum[1][1],dimSize))  
    #                self.__dict__[enum[1][0]] = np.ma.concatenate((self.__dict__[enum[1][0]], np.ma.masked_array(np.repeat(np.nan,dimSize - varSize),mask=np.zeros(dimSize - varSize,dtype='bool'))))
    
                    #Save additonnal attributes
                    attrStr={}
                    for a in set(self.__dict__[enum[1][0]].__dict__.keys()).difference(np.ma.empty(0,dtype=bool).__dict__.keys()):
                        attrStr.update({a:self.__dict__[enum[1][0]].__dict__[a]})
                    self.__dict__[enum[1][0]] = np.ma.masked_array( np.append(self.__dict__[enum[1][0]].data,np.repeat(self.__dict__[enum[1][0]].fill_value if hasattr(self.__dict__[enum[1][0]],'fill_value') else np.NaN,dimSize[n] - varSize)),
                                                                    mask=np.append(self.__dict__[enum[1][0]].mask,np.ones(dimSize[n] - varSize,dtype='bool')) )
                    self.__dict__[enum[1][0]].__dict__.update(attrStr)
def check_variables ( self ) : self . count = len ( self . fileid ) self . size = np . size ( [ np . size ( self . __dict__ . get ( par ) ) for par in self . par_list ] ) infos = zip ( * ( self . par_list . tolist ( ) , self . dim_list . tolist ( ) ) ) for enum in enumerate ( infos ) : varSize = np . size ( self . __dict__ . get ( enum [ 1 ] [ 0 ] ) ) varShape = np . shape ( self . __dict__ . get ( enum [ 1 ] [ 0 ] ) ) [ : : - 1 ] dimSize = None if hasattr ( self . __dict__ . get ( enum [ 1 ] [ 0 ] ) , '_dimensions' ) : dumDim = self . __dict__ . get ( enum [ 1 ] [ 0 ] ) . _dimensions dumDim . pop ( '_ndims' ) dimSize = tuple ( dumDim . values ( ) ) elif isinstance ( self . __dict__ . get ( enum [ 1 ] [ 0 ] ) , dict ) : if self . __dict__ . get ( enum [ 1 ] [ 0 ] ) . has_key ( '_dimensions' ) : dumDim = self . __dict__ . get ( enum [ 1 ] [ 0 ] ) [ '_dimensions' ] dumDim . pop ( '_ndims' ) dimSize = tuple ( dumDim . values ( ) ) if dimSize is None : if isinstance ( self . _dimensions , dimStr ) : dimSize = ( self . _dimensions ) . get ( enum [ 1 ] [ 1 ] ) else : dimSize = tuple ( [ ( self . _dimensions ) . get ( [ d ] ) for d in enum [ 1 ] [ 1 ] ] ) masked = isinstance ( self . __dict__ . get ( enum [ 1 ] [ 0 ] ) , np . ma . masked_array ) if masked : if ( self . __dict__ . get ( enum [ 1 ] [ 0 ] ) . mask . size != self . __dict__ . get ( enum [ 1 ] [ 0 ] ) . data . size ) : raise np . ma . core . MaskError ( "Mask length is not consistent with data" ) self . message ( 4 , 'checking variables -> {0}(N={1}) - {2}:{3}' . format ( enum [ 1 ] [ 0 ] , varSize , enum [ 1 ] [ 1 ] , dimSize ) ) for n , sh in enumerate ( varShape ) : if ( sh > dimSize [ n ] ) : self . Error ( 'Object variable {0} greater than corresponding dimension ({1})' . format ( enum [ 1 ] [ 0 ] , enum [ 1 ] [ 1 ] ) ) elif ( sh < dimSize [ n ] ) : self . message ( 3 , 'Variable {0}(N={1}) being extended to match dimension {2}:{3}' . format ( enum [ 1 ] [ 0 ] , varSize , enum [ 1 ] [ 1 ] , dimSize ) ) attrStr = { } for a in set ( self . __dict__ [ enum [ 1 ] [ 0 ] ] . __dict__ . keys ( ) ) . difference ( np . ma . empty ( 0 , dtype = bool ) . __dict__ . keys ( ) ) : attrStr . update ( { a : self . __dict__ [ enum [ 1 ] [ 0 ] ] . __dict__ [ a ] } ) self . __dict__ [ enum [ 1 ] [ 0 ] ] = np . ma . masked_array ( np . append ( self . __dict__ [ enum [ 1 ] [ 0 ] ] . data , np . repeat ( self . __dict__ [ enum [ 1 ] [ 0 ] ] . fill_value if hasattr ( self . __dict__ [ enum [ 1 ] [ 0 ] ] , 'fill_value' ) else np . NaN , dimSize [ n ] - varSize ) ) , mask = np . append ( self . __dict__ [ enum [ 1 ] [ 0 ] ] . mask , np . ones ( dimSize [ n ] - varSize , dtype = 'bool' ) ) ) self . __dict__ [ enum [ 1 ] [ 0 ] ] . __dict__ . update ( attrStr )
Forces variables to respect dimensions