def update_dataset(self,dataStr,flatten=False):
        '''
        update class with a data structure.
        
        :keyword flatten: use this to automatically flatten variables (squeeze dimensions)
        '''

        #Load keys and dimensions
        #########################
        dataDim = dataStr.pop('_dimensions',{})
        attrStr = dataStr.pop('_attributes',{})
        ndims = dataDim.pop('_ndims',0)
        dimensions = [dataDim.keys(),dataDim.values()]
        
        keys = dataStr.keys()
        if len(keys) == 0:
            self.warning(2, 'No data loaded')
            return
        self.message(2, 'Loaded variables : '+str(keys))
        
        #Check what is the current variable type
        isStructure = True if isinstance(dataStr[keys[0]],dict) else False
        
#        datalen = [np.size(dataStr[key]) for key in keys]
        datalen = [list(np.shape(dataStr[key]['data'])[::-1]) for key in keys] if isStructure else [list(np.shape(dataStr[key])[::-1]) for key in keys] #Shape is inverted wrt to order of dimensions to be consistent with check_variable
        if isStructure :
            varDim = [list(dataStr[key]['_dimensions'])[1:] for key in keys]
            ind = [where_list(vDim,dimensions[0]) for vDim in varDim] #Dimensions indices from actual variables' dimensions
            
            #Check dimension lengths
#             dimOk = np.array([enum[1][0] == dimensions[1][ind[enum[0]][0]] for enum in enumerate(datalen)])
            dimOk = [any([enum[1][ii] == dimensions[1][jj] for ii,jj in enumerate(ind[enum[0]])]) for enum in enumerate(datalen)]
            

            if any([not d for d in dimOk]) : 
                notOk = np.where(~np.array(dimOk))[0]
                print datalen
                
                self.Error('Problem with {0} variables : {1}'.format(len(notOk),','.join(np.array(dataStr.keys())[notOk])))
        else :
            ind = [where_list(dlen,dimensions[1]) for dlen in datalen] #Dimensions indices from variable length
            if (np.array(ind).sum() == -1)!= 0 : self.Error('At least one variable have not been properly defined')
            
        dimname = [np.array(dimensions[0])[i].tolist() for i in ind]  #Get correspondance between data structure dimensions and variables
                
        curDim, nself=self.get_currentDim()
        createDim=np.array([np.array([w == -1 for w in where_list(j, curDim[0])]) for i,j in enumerate(dimname) ])
        createDim=np.squeeze(createDim)
#        curInd = atools.where_list(dimname_reduced,curDim[0]) #Get correspondance between data structure dimensions and object dimensions
        
#        createDim = (np.array(curInd) == -1) #Get dimensions to be created   
        toCreate = np.array([not self.__dict__.has_key(key) for key in keys])
        
        updateDim=[]  
        
        self.message(2, 'Updating object with '+str(['{0}({1}:{2})'.format(i[0],i[1],i[2]) for i in zip(*(keys,dimname,datalen))]))
        
        #Update variables available in files
        for enum in enumerate(keys) :
            
            ind=enum[0]
            key=enum[1]
            
            #Load variable
            ##############
#            var=dataStr.get(key)
            dum=dataStr.get(key).pop('data') if isStructure else copy.deepcopy(dataStr.get(key)) 
            if flatten :
                if isinstance(dum,dict) :dum['data']=dum['data'].flatten()
                else : dum=dum.flatten()
            
            if not isStructure :
                dum={'_dimensions':dum._dimensions if hasattr(dum,'_dimensions') else {},
                      '_attributes':dum._attributes if hasattr(dum,'_attributes') else {},
                      'data':dum}
            else :
                dumStr=dataStr.get(key)
                dumStr.update({'data':dum})
                dum=dumStr

            dumDim=dimStr(dimname[ind],datalen[ind])

#             if dataStr[key].has_key('_attributes'):
#                 dum.update(dataStr[key]['_attributes'])
#            if isinstance(dum,np.ma.masked_array) : 
            
#            #Get associated dimensions
#            ##################################
#            datalen = datalen[ind]#[len(dataStr[key]) for key in keys]
#            ind = atools.where_list([datalen],dimensions[1])[0]
#            if (ind == -1) : self.Error('Dimensions of current variable ('+key+') have not been properly defined')
#            dimname = dimensions[
            
            #Initialize variable if required
#            if toCreate :
#            updateDim.append(self.create_Variable(key, dum, dimensions={dimname[ind]:datalen[ind]},toCreate=toCreate[ind],createDim=createDim[ind]))
            updateDim.append(self.create_Variable(key, dum, dimensions=dumDim,toCreate=toCreate[ind],createDim=createDim[ind]))

        
        #Extend missing variables
#         missing__keys = list(set(self.par_list).difference(keys))
#         for enum in enumerate(missing__keys) :
#             ind=enum[0]
#             key=enum[1]
#             updateDim.append(self.create_Variable(key, np.ma.repeat(self.dist_to_coast_leuliette.fill_value), dimensions=dumDim,toCreate=False,createDim=False))
        
        
        #Final sequence
        
        zipped_upd=zip(*(np.hstack(dimname)[~np.hstack(createDim)],np.hstack(datalen)[~np.hstack(createDim)]))
        updateDim_List = np.array(list(set(tuple(i) for i in np.array(zipped_upd,dtype='|S16').tolist()))) #2D unique
#        updateDim_List = np.unique(np.array(zipped_upd,dtype='|S16')) #[str(i) for i in datalen]
#        if updateDim_List.size > 0 : updateDim_List.resize((2,updateDim_List.size/2))
#        updateDim_List = np.unique(zip(*(np.array(dimname)[~createDim],np.array(datalen)[~createDim]))) #[str(i) for i in datalen]

        zipped_dims=zip(*(np.hstack(dimname)[np.hstack(createDim)],np.hstack(datalen)[np.hstack(createDim)]))
        createDim_list = np.array(list(set(tuple(i) for i in np.array(zipped_dims,dtype='|S16').tolist()))) #2D unique
#        clist, inv = np.unique(np.array(zipped_dims,dtype='|S16'),return_inverse=True) #RQ : THIS WILL FAIL IF NUMBERS HAVE MORE THAN 16 DIGITS #[str(i) for i in datalen]
#        if createDim_list.size > 0 : createDim_list.resize((2,createDim_list.size/2))
        
#        createDim_list = np.unique(zip(*(np.array(dimname)[createDim],np.array(datalen)[createDim]))) #[str(i) for i in datalen]
        
        for dname,dim in createDim_list :
            self.create_Dim(dname, np.int(dim))
        
        for dname,dim in updateDim_List:
            self.update_Dim(dname, np.int(dim))
def update_dataset ( self , dataStr , flatten = False ) : dataDim = dataStr . pop ( '_dimensions' , { } ) attrStr = dataStr . pop ( '_attributes' , { } ) ndims = dataDim . pop ( '_ndims' , 0 ) dimensions = [ dataDim . keys ( ) , dataDim . values ( ) ] keys = dataStr . keys ( ) if len ( keys ) == 0 : self . warning ( 2 , 'No data loaded' ) return self . message ( 2 , 'Loaded variables : ' + str ( keys ) ) isStructure = True if isinstance ( dataStr [ keys [ 0 ] ] , dict ) else False datalen = [ list ( np . shape ( dataStr [ key ] [ 'data' ] ) [ : : - 1 ] ) for key in keys ] if isStructure else [ list ( np . shape ( dataStr [ key ] ) [ : : - 1 ] ) for key in keys ] if isStructure : varDim = [ list ( dataStr [ key ] [ '_dimensions' ] ) [ 1 : ] for key in keys ] ind = [ where_list ( vDim , dimensions [ 0 ] ) for vDim in varDim ] dimOk = [ any ( [ enum [ 1 ] [ ii ] == dimensions [ 1 ] [ jj ] for ii , jj in enumerate ( ind [ enum [ 0 ] ] ) ] ) for enum in enumerate ( datalen ) ] if any ( [ not d for d in dimOk ] ) : notOk = np . where ( ~ np . array ( dimOk ) ) [ 0 ] print datalen self . Error ( 'Problem with {0} variables : {1}' . format ( len ( notOk ) , ',' . join ( np . array ( dataStr . keys ( ) ) [ notOk ] ) ) ) else : ind = [ where_list ( dlen , dimensions [ 1 ] ) for dlen in datalen ] if ( np . array ( ind ) . sum ( ) == - 1 ) != 0 : self . Error ( 'At least one variable have not been properly defined' ) dimname = [ np . array ( dimensions [ 0 ] ) [ i ] . tolist ( ) for i in ind ] curDim , nself = self . get_currentDim ( ) createDim = np . array ( [ np . array ( [ w == - 1 for w in where_list ( j , curDim [ 0 ] ) ] ) for i , j in enumerate ( dimname ) ] ) createDim = np . squeeze ( createDim ) toCreate = np . array ( [ not self . __dict__ . has_key ( key ) for key in keys ] ) updateDim = [ ] self . message ( 2 , 'Updating object with ' + str ( [ '{0}({1}:{2})' . format ( i [ 0 ] , i [ 1 ] , i [ 2 ] ) for i in zip ( * ( keys , dimname , datalen ) ) ] ) ) for enum in enumerate ( keys ) : ind = enum [ 0 ] key = enum [ 1 ] dum = dataStr . get ( key ) . pop ( 'data' ) if isStructure else copy . deepcopy ( dataStr . get ( key ) ) if flatten : if isinstance ( dum , dict ) : dum [ 'data' ] = dum [ 'data' ] . flatten ( ) else : dum = dum . flatten ( ) if not isStructure : dum = { '_dimensions' : dum . _dimensions if hasattr ( dum , '_dimensions' ) else { } , '_attributes' : dum . _attributes if hasattr ( dum , '_attributes' ) else { } , 'data' : dum } else : dumStr = dataStr . get ( key ) dumStr . update ( { 'data' : dum } ) dum = dumStr dumDim = dimStr ( dimname [ ind ] , datalen [ ind ] ) updateDim . append ( self . create_Variable ( key , dum , dimensions = dumDim , toCreate = toCreate [ ind ] , createDim = createDim [ ind ] ) ) zipped_upd = zip ( * ( np . hstack ( dimname ) [ ~ np . hstack ( createDim ) ] , np . hstack ( datalen ) [ ~ np . hstack ( createDim ) ] ) ) updateDim_List = np . array ( list ( set ( tuple ( i ) for i in np . array ( zipped_upd , dtype = '|S16' ) . tolist ( ) ) ) ) zipped_dims = zip ( * ( np . hstack ( dimname ) [ np . hstack ( createDim ) ] , np . hstack ( datalen ) [ np . hstack ( createDim ) ] ) ) createDim_list = np . array ( list ( set ( tuple ( i ) for i in np . array ( zipped_dims , dtype = '|S16' ) . tolist ( ) ) ) ) for dname , dim in createDim_list : self . create_Dim ( dname , np . int ( dim ) ) for dname , dim in updateDim_List : self . update_Dim ( dname , np . int ( dim ) )
update class with a data structure.
        
        :keyword flatten: use this to automatically flatten variables (squeeze dimensions)