def slicej(self,varname,ind,time=0,**opts): coords=opts.get('coords',self._default_coords('slicej')).split(',') out=Data() out.msg=self.check_slice(varname,t=time,j=ind) if out.msg: return out v=self.use(varname,SEARCHtime=time,eta_SEARCH=ind) # add mask if not masked: if not np.ma.isMA(v): m=self.grid.vars(ruvp=self.var_at(varname)[0],j=ind)[-1] if v.ndim==2: m=np.tile(m,(v.shape[0],1)) v=np.ma.masked_where(m==0,v) out.v=v out.info['v']['name']=varname out.info['v']['slice']='j=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.name,varname,'units') except: pass # coords: if 'z' in coords and v.ndim==2: ###### out.z=self.s_levels(time=time,ruvpw=self.var_at(varname),j=ind) out.z=self.s_levels(time=time,loc=self.var_at(varname),j=ind) out.info['z']=dict(name='Depth',units='m') if any([i in coords for i in 'xyd']): x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)[0],j=ind) if 'd' in coords: d=calc.distance(x,y) if d[-1]-d[0]>1e4: d=d/1000. dunits='km' else: dunits='m' if v.ndim==2: d=np.tile(d,(v.shape[0],1)) out.d=d out.info['d']=dict(name='Distance',units=dunits) if 'x' in coords: if v.ndim==2: x=np.tile(x,(v.shape[0],1)) out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') if 'y' in coords: if v.ndim==2: y=np.tile(y,(v.shape[0],1)) out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') if 't' in coords and self.hast(varname): out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'd' in coords: out.extra[0].x=out.d[0] if 'x' in coords: out.extra[0].y=out.x[0] if 'y' in coords: out.extra[0].x=out.y[0] out.extra[0].v=-h out.extra[0].config['d1.plot']='fill_between' out.extra[0].config['d1.y0']=-h.max()-(h.max()-h.min())/20. out.extra[0].alias='bottom' out.coordsReq=','.join(sorted(coords)) return out
def slicell(self,varname,X,Y,time=0,**opts): coords=opts.get('coords',self._default_coords('slicell')).split(',') data = opts.get('data',False) extrap = opts.get('extrap',False) maskLimit = opts.get('lmask',0.5) # points where interpolated mask are above # this value are considered as mask! # Most strict value is 0 out=Data() out.msg=self.check_slice(varname,t=time) if out.msg: return out#None,aux X=np.asarray(X) Y=np.asarray(Y) if X.ndim>1: X=np.squeeze(X) if Y.ndim>1: Y=np.squeeze(X) x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)[0]) if True: # extrat only portion of data needed: i0,i1,j0,j1=calc.ij_limits(x, y, (X.min(),X.max()),(Y.min(),Y.max()), margin=1) xi='%d:%d'%(i0,i1) eta='%d:%d'%(j0,j1) if data is False: V=self.use(varname,SEARCHtime=time,xi_SEARCH=xi,eta_SEARCH=eta) else: v=data[...,j0:j1,i0:i1] x=x[j0:j1,i0:i1] y=y[j0:j1,i0:i1] #h=h[j0:j1,i0:i1] # not used m=m[j0:j1,i0:i1] else: if data is False: V=self.use(varname,SEARCHtime=time) else: v=data if V.ndim==3: v=calc.griddata(x,y,V,X,Y,extrap=extrap,mask2d=m==0, keepMaskVal=maskLimit) elif V.ndim==2: v=calc.griddata(x,y,np.ma.masked_where(m==0,V),X,Y,extrap=extrap, keepMaskVal=maskLimit) out.v=v out.info['v']['name']=varname out.info['v']['slice']='path npts=%d'%X.size try: out.info['v']['units']=netcdf.vatt(self.nc,varname,'units') except: pass # coords: if 'z' in coords and V.ndim==3: inds=dict(xi=(i0,i1),eta=(j0,j1)) ######### out.z=self.path_s_levels(time,X,Y,rw=varname[0],inds=inds) out.z=self.path_s_levels(time,X,Y,rw=self.var_at(varname)[1],inds=inds) if 'd' in coords: d=calc.distance(X,Y) if v.ndim==2: d=np.tile(d,(v.shape[0],1)) out.d=d if 'x' in coords: if v.ndim==2: X=np.tile(X,(v.shape[0],1)) out.x=X if 'y' in coords: if v.ndim==2: Y=np.tile(Y,(v.shape[0],1)) out.y=Y if 't' in coords and self.hast(varname): out.t=self.time[time] out.coordsReq=','.join(sorted(coords)) return out
def slicej(self,varname,ind,time=0,**opts): coords=opts.get('coords',self._default_coords('slicej')).split(',') out=Data() out.msg=self.check_slice(varname,t=time,j=ind) if out.msg: return out v=self.use(varname,SEARCHtime=time,eta_SEARCH=ind) # add mask if not masked: if not np.ma.isMA(v): m=self.grid.vars(ruvp=self.var_at(varname),j=ind)[-1] if v.ndim==2: m=np.tile(m,(v.shape[0],1)) v=np.ma.masked_where(m==0,v) out.v=v out.info['v']['name']=varname out.info['v']['slice']='j=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.name,varname,'units') except: pass # coords: if 'z' in coords and v.ndim==2: out.z=self.s_levels(time=time,ruvpw=self.var_at(varname),j=ind) out.info['z']=dict(name='Depth',units='m') if any([i in coords for i in 'xyd']): x,y,h,m=self.grid.vars(ruvp=self.var_at(varname),j=ind) if 'd' in coords: d=calc.distance(x,y) if d[-1]-d[0]>1e4: d=d/1000. dunits='km' else: dunits='m' if v.ndim==2: d=np.tile(d,(v.shape[0],1)) out.d=d out.info['d']=dict(name='Distance',units=dunits) if 'x' in coords: if v.ndim==2: x=np.tile(x,(v.shape[0],1)) out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') if 'y' in coords: if v.ndim==2: y=np.tile(y,(v.shape[0],1)) out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') if 't' in coords: out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'd' in coords: out.extra[0].x=out.d[0] if 'x' in coords: out.extra[0].y=out.x[0] if 'y' in coords: out.extra[0].x=out.y[0] out.extra[0].v=-h out.extra[0].config['1d.plot']='fill_between' out.extra[0].config['1d.y0']=-h.max()-(h.max()-h.min())/20. out.extra[0].alias='bottom' out.coordsReq=','.join(sorted(coords)) return out
def slicell(self,varname,X,Y,time=0,**opts): # x,y,z,v,m=[[]]*5 ######## plot= opts.get('plot',False) ######### ax = opts.get('ax',None) coords=opts.get('coords',self._default_coords('slicell')).split(',') data = opts.get('data',False) # dist = opts.get('dist',False) extrap = opts.get('extrap',False) # varOnly = opts.get('retv',False) maskLimit = opts.get('lmask',0.5) # points where interpolated mask are above # this value are considered as mask! # Most strict value is 0 out=Data() out.msg=self.check_slice(varname,t=time) if out.msg: return out#None,aux X=np.asarray(X) Y=np.asarray(Y) if X.ndim>1: X=np.squeeze(X) if Y.ndim>1: Y=np.squeeze(X) # if varname not in netcdf.varnames(self.name): # print ':: variable %s not found' % varname # return x,y,z,v,m # # if time>=self.TIME: # print 't = %d exceeds TIME dimension (%d)' % (time,self.TIME) # return x,y,z,v,m x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)) if True: # extrat only portion of data needed: ## print 'start', x.shape,y.shape,X.shape i0,i1,j0,j1=calc.ij_limits(x, y, (X.min(),X.max()),(Y.min(),Y.max()), margin=1) ## print 'end' xi='%d:%d'%(i0,i1) eta='%d:%d'%(j0,j1) if data is False: V=self.use(varname,SEARCHtime=time,xi_SEARCH=xi,eta_SEARCH=eta) else: v=data[...,j0:j1,i0:i1] x=x[j0:j1,i0:i1] y=y[j0:j1,i0:i1] h=h[j0:j1,i0:i1] m=m[j0:j1,i0:i1] else: if data is False: V=self.use(varname,SEARCHtime=time) else: v=data if V.ndim==3: v=calc.griddata(x,y,V,X,Y,extrap=extrap,mask2d=m==0, keepMaskVal=maskLimit) elif V.ndim==2: v=calc.griddata(x,y,np.ma.masked_where(m==0,V),X,Y,extrap=extrap, keepMaskVal=maskLimit) # coords: if 'z' in coords and V.ndim==3: out.z=self.path_s_levels(time,X,Y,rw=varname[0]) if 'd' in coords: d=calc.distance(X,Y) if v.ndim==2: d=np.tile(d,(v.shape[0],1)) out.d=d if 'x' in coords: if v.ndim==2: X=np.tile(X,(v.shape[0],1)) out.x=X if 'y' in coords: if v.ndim==2: Y=np.tile(Y,(v.shape[0],1)) out.y=Y if 't' in coords: out.t=self.time[time] # # X, Y, dist: # if dist: # Dist=calc.distance(X,Y) # if v.ndim==3: # Dist=np.tile(Dist,(v.shape[0],1)) # else: # if v.ndim==3: # X=np.tile(X,(v.shape[0],1)) # Y=np.tile(Y,(v.shape[0],1)) # # if dist: # return Dist,Z,V # else: # return X,Y,Z,V # # if plot: # if not ax: ax=pl.gca() # if v.ndim==2: # if 'x' in coords: # p=ax.pcolormesh(out.x,out.z,v) ### ax.plot(aux.x[0],-h) # elif 'y' in coords: # p=ax.pcolormesh(out.y,out.z,v) ### ax.plot(aux.y[0],-h) # else: # p=ax.pcolormesh(out.d,out.z,v) #### ax.plot(aux.d[0],-h) ## # pl.colorbar(p,shrink=.7) ## elif v.ndim==1: # if 'x' in coords: # ax.plot(out.x,v) # elif 'y' in coords: # ax.plot(out.y,v) # else: # ax.plot(out.d,v) # out.v=v out.coordsReq=','.join(sorted(coords)) return out###v,aux