Read AVISO Along-Track SLA regional products
        
        :return outStr: Output data structure containing all recorded parameters as specificied by NetCDF file PARAMETER list.
        :author: Renaud Dussurget

def read_CTOH(self,filename,params=None,force=False,timerange=None,datatype=None,**kwargs):
        
        """
        Read AVISO Along-Track SLA regional products
        
        :return outStr: Output data structure containing all recorded parameters as specificied by NetCDF file PARAMETER list.
        :author: Renaud Dussurget
        """
        
        #Open file
        self._filename = filename
        try:
            self._ncfile = ncfile(self._filename, "r")
        except Exception,e:
            self.warning(1, repr(e))
            return {}

        
        #Get file infos from filename
        
        #Get delimiter
        delim = '.'
        
        #Gat sat name
        splitted=os.path.basename(filename).split(delim)
        sat_name = splitted[3]
        track = np.ma.masked_array(int(splitted[-2]))
        ntracks=1
     
        #Get list of recorded parameters:
        par_list=[i.encode() for i in self._ncfile.variables.keys()]
        for i in ['cycle','lon','lat'] : par_list.pop(par_list.index(i))
        nparam=len(par_list)
        
        self.message(2,'Recorded parameters : '+str(nparam)+' -> '+str(par_list))
     
        lon = self.load_ncVar('lon',**kwargs)
        lon['data'] = recale(lon['data'], degrees=True, zero_2pi=True) #shift longitudes
        lat = self.load_ncVar('lat',**kwargs)

        
        #Extract within limits
        ind, flag = in_limits(lon['data'],lat['data'],limit=self.limit)
        latout = lat.pop('data').compress(flag)
        lonout = lon.pop('data').compress(flag)
        nlon = len(lonout)
        
        #Get cycles
        cycle = self.load_ncVar('cycle',time=ind,**kwargs)
        cycleout = cycle.pop('data')
        ncycles = len(cycleout)
        
        N = ncycles * nlon
        
        mask=np.repeat(lonout.mask,ncycles) & np.repeat(latout.mask,ncycles) & np.repeat(cycleout.mask,nlon)
        
        #update index
        ind = np.repeat(ind, ncycles)
        
        
        lon={'_dimensions':{'_ndims':1,'time':N},
             '_attributes':lon['_attributes'],
             'data':np.ma.masked_array(np.repeat(lonout.data,ncycles),mask=mask),
             'long_name':'longitude'}
#         lon.update()
        
        lat={'_dimensions':{'_ndims':1,'time':N},
             '_attributes':lat['_attributes'],
             'data':np.ma.masked_array(np.repeat(latout.data,ncycles),mask=mask),
             'long_name':'latitude'}
        
        cycle={'_dimensions':{'_ndims':1,'time':N},
               '_attributes':cycle['_attributes'],
             'data':np.ma.masked_array(np.repeat(cycleout.data,nlon).reshape((ncycles,nlon)).T.flatten(),mask=mask),
             'long_name':'cycle_number'}
        
        track={'_dimensions':{'_ndims':1,'time':N},
               'data':np.ma.masked_array(np.repeat(track,N),mask=mask),
               'long_name':'track_number'}
        
        outStr={'_dimensions':{'_ndims':1,'time':N},
                'lon':lon,
                'lat':lat,
                'track':track,
                'cycle':cycle}
        
        for param in par_list :
            dumVar = self.load_ncVar(param,time=ind,**kwargs) #Load variables
            dimStr=dumVar.pop('_dimensions')
            attrStr=dumVar.pop('_attributes')
            
            #Get dimension properties
#             curDim = [str(dimname) for dimname in dimStr.keys()[1:]] #[str(dimname) for dimname in self._ncfile.variables['LONGITUDE'].dimensions]
#             curDimval = [dimStr[dim] for dim in curDim] #[len(self._ncfile.dimensions[dimname]) for dimname in curDim]
            
            #Repeat if only 1 dim
            if dimStr['_ndims'] == 1:
                dumVar={'data':np.ma.repeat(dumVar.pop('data'),N/dimStr[dimStr.keys()[dimStr['_ndims']]])}
            #Else flatten
            else :
                dumVar={'data':dumVar.pop('data').flatten()}
                
            #update with dimensions
            dumVar['_dimensions']=outStr['_dimensions'].copy()
            dumVar['_attributes']=attrStr
                  
            cmd = 'dumStr = {\''+param.lower()+'\':dumVar}'
            self.message(4, 'exec : '+cmd)
            exec(cmd)
            outStr.update(dumStr)
        
#         id={'_dimensions':{'_ndims':1,'time':N},
#             'data':np.repeat(sat_name,N)}
#          
#          
#         outStr.update({'id':id})
        self._ncfile.close()
        
        return outStr