def check_rst(date,cf,wait=900): '''check rst for forecast, and wait for tdiff''' FA='a' date0=dateu.next_date(date,-1) rst=opt.nameof('out','rst',date=date0,FA=FA,cf=cf) # check also if run terminated! The rst may not have the last reccord yet! rout=opt.nameof('out','rout',date=date0,FA=FA,cf=cf) if os.path.isfile(rst) and is_roms_out_ok(rout): return True else: now = dateu.currday() tdiff = dateu.date_diff(date,now) print "waiting for rst" while tdiff.days < 1.5: time.sleep(wait) sys.stdout.write('.') now = dateu.currday() tdiff = dateu.date_diff(date,now) cond=os.path.isfile(rst) and is_roms_out_ok(rout) print " rst file ready = ",cond,' at ',now, tdiff if cond: return True return os.path.isfile(rst)
def gen_clmbry(date,FA='a',nest=0,cf=CONF,quiet=True): date=dateu.parse_date(date) err='' isFatal=False fclm=opt.nameof('in','clm',date=date,FA=FA,nest=nest,cf=cf) fbry=opt.nameof('in','bry',date=date,FA=FA,nest=nest,cf=cf) grd=opt.nameof('in','grd',cf=cf) if os.path.isfile(fclm) and os.path.isfile(fbry): err='CLMBRY files already exists' isFatal=False else: nforec=opt.n_pred(cf) import get_mercator as get_hycom # no need to check if data is ready! if not gen_clm_bry will return error! # anyway, cannot know if hycom data of today is analtsis or forecast!! date1=None if FA=='f': date1=dateu.parse_date(dateu.next_date(date,nforec)) try: err=get_hycom.gen_clm_bry(fclm,fbry,grd,date,date1,quiet=quiet) if err: err='ERROR creating clm bry files : %s' % err isFatal=True except: err='ERROR creating clm bry files' isFatal=True return err, isFatal, fclm,fbry
def gen_atmfrc(date,FA='a',nest=0,cf=CONF,quiet=True): date=dateu.parse_date(date) err='' isFatal=False fname=opt.nameof('in','blk',date=date,FA=FA,nest=nest,cf=cf) if os.path.isfile(fname): err='BLK file already exists' isFatal=False else: grd=opt.nameof('in','grd',cf=cf) atmPath = opt.pathof(cf,'external','atm') atmData=opt.atm_info(cf)['data'] nforec=opt.n_pred(cf) if atmData=='wrf': cycle=366-29+dateu.mndays(date.year,date.month) err=bfrc.make_blk_wrf(fname,grd,date,FA,atmPath,quiet=quiet,cycle=cycle) elif atmData=='gfs': from okean.roms.inputs import surface if FA=='a': nforec=0 model=opt.get_conf(cf,'MODEL','name',type=str)[nest].lower() surface.make_blk_gfs(atmPath,grd,fname,date,nforec=nforec,model=model,quiet=quiet) try: if err: err='ERROR creating bulk file ('+err+')' isFatal=True except OSError, e: err='ERROR creating bulk file ('+str(e)+')' isFatal=True except:
def gen_ini(date,FA='a',nest=0,cf=CONF): date=dateu.parse_date(date) dateRst=dateu.next_date(date,-1) rst=opt.nameof('out','rst',date=dateRst,FA=FA,nest=nest,cf=cf) ini=opt.nameof('in', 'ini',date=date,FA=FA,nest=nest,cf=cf) err=False isFatal=False if os.path.isfile(ini): err='INI file already exists: ....%s' % ini[-30:] isFatal=False elif not os.path.isfile(rst): err='RST file not found: %s' % rst isFatal=True else: y,m,d=date.year,date.month,date.day model=opt.get_conf(cf,'MODEL','name',type=str)[nest] if model.lower()=='roms-agrif' and (m,d)==(1,1): # copy and change time to 0: err=opt.restart_ini(rst,ini) if err: isFatal=True else: # do not copy, create link: try: os.symlink(rst,ini) except OSError, e: err=e.strerror isFatal=True
def zip_plots(cf,year,month,clean=False,quiet=False,overwrite=False,output=sys.stdout): pltpath=opt.nameof('out','plots',cf=cf) p=os.path.join(pltpath,'%s' % year,'%02d_*' % month) folders=glob.glob(p) folders.sort() monthn=dateu.month_names(month).lower() zipfile='plots_%s_%d.tar.gz' % (monthn,year) zipfile=os.path.join(pltpath,'%s' % year,zipfile) if os.path.isfile(zipfile) and not overwrite: if not quiet: print >>output,'zip file % s already exist' % zipfile return # create zip: if folders: cb.tar_gz_dir(folders,zipfile) if not quiet: if folders: print >>output,'Created tar.gz %s with contents:' % zipfile for i in folders: print >>output,' %s' % i else: print >>output,'No tar.gz created for %d %02d' % (year,month) # remove original files: if clean: for i in folders: if not quiet: print >>output,'removing %s' % i shutil.rmtree(i)
def load(self): if not self.logfile: self.rout=False return False f=open(self.logfile) L=f.readlines() # tend and dt only written at the end of model run, so give some # invalid values: self.tend = -1 self.tend_str = 'not ended' self.dt = -1 for i in range(len(L)-1): k=L[i].strip() val=L[i+1].strip() if k.find('[job/process id]')==0: self.pid = val elif k.find('[queue/local]')==0: self.job_type = val # elif k.find('[date]')==0: self.date = val # elif k.find('[FA]')==0: self.FA = val elif k.find('[tstart]')==0: self.tstart,self.tstart_str = int(val.split()[0]),sjoin(val.split()[1:]) elif k.find('[tend]')==0: self.tend,self.tend_str = int(val.split()[0]),sjoin(val.split()[1:]) elif k.find('[dt (min)]')==0: self.dt=float(val) self.rout=opt.nameof('out','rout',date=self.date,FA=self.FA,cf=self.conf) return True
def clean_nc_files(cf, date1, date2, type, FA, nest=0, mdkeep=0, wkeep=-1, clean=False, quiet=False, output=sys.stdout): ''' mdkeep: day,month to keep ex: mdkeep=1 => keep day 1 of every month ex: mdkeep=(1,1) => keep day 1 of January (month,day) ex: mdkeep=0 => no keep wkeep: day of week to keep: ex: wkeep=0 => keep first day of week (synday) ex: wkeep=-1 => no keep ''' date = date1 while date <= date2: f = opt.nameof('out', type, date, FA, nest, cf) if os.path.isfile(f): hs = cb.hsize(os.path.getsize(f)) y, m, d = dateu.parse_date(date) dweek = dateu.parse_date(date).weekday() if mdkeep == -1: MDkeep = dateu.mndays( y, m) # last day of month, then calc last day: else: MDkeep = mdkeep if MDkeep and MDkeep == d or MDkeep == (m, d): if not quiet: print >> output, '*Keeping ', date, ' ', f, ' ', hs[0], hs[ 1], '**', MDkeep elif wkeep != -1 and wkeep == dweek: if not quiet: print >> output, '*Keeping ', date, ' ', f, ' ', hs[0], hs[ 1], '*', wkeep else: if not quiet: if clean: print >> output, 'Removing ', date, ' ', f, ' ', hs[ 0], hs[1] else: print >> output, 'Not removing ', date, ' ', f, ' ', hs[ 0], hs[1] if clean: os.remove(f) else: print >> output, date, ' ', FA, ' no file' date = dateu.next_date(date, 1)
def op_plt_wind(conf, plconf, date, FA='a', nest=0, **kargs): closefig = kargs.get('closefig', True) clearfig = kargs.get('clearfig', True) save = kargs.get('save', True) date = dateu.parse_date(date) Figure, err = opt.get_plconf(plconf, 'FIGURE') Err = [] Out = [] pltpath = opt.nameof('out', 'plots', cf=conf) Data, err = opt.get_plconf(plconf, 'WIND') ifig = -1 for tag in Figure['tag']: ifig += 1 args = {} args['ifig'] = ifig tind = Data['time'][ifig] if tind == 'dailyMean': if FA == 'a': ndays = 1 elif FA == 'f': ndays = int(opt.get_conf(conf, 'PRED', 'npred')[0]) for day in range(ndays): # loop over time: args['day'] = day err, fig, info = plt_wind(conf, plconf, date, FA, nest, **args) Err += [err] if not err: # save: if save: if tag: Tag = '_' + tag else: Tag = tag savename = 'wind_%s_%s_%d_n%d%s' % ( date.strftime('%Y%m%d'), FA, day, nest, Tag) Y, M, D = date.year, date.month, date.day Ydest = os.path.join(pltpath, '%s' % Y) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D)) if not os.path.isdir(MDdest): os.mkdir(MDdest) savename = os.path.join( MDdest, savename + '.' + Figure['extension'][ifig]) Out += [savename] pl.savefig(savename, dpi=pl.gcf().dpi) if clearfig: fig.clear() if closefig: pl.close(fig) return Err, Out
def op_plt_wind(conf,plconf,date,FA='a',nest=0,**kargs): closefig = kargs.get('closefig',True) clearfig = kargs.get('clearfig',True) save = kargs.get('save',True) date=dateu.parse_date(date) Figure,err = opt.get_plconf(plconf,'FIGURE') Err=[] Out=[] pltpath = opt.nameof('out','plots',cf=conf) Data,err = opt.get_plconf(plconf,'WIND') ifig=-1 for tag in Figure['tag']: ifig+=1 args={} args['ifig']=ifig tind = Data['time'][ifig] if tind == 'dailyMean': if FA=='a': ndays=1 elif FA=='f': ndays=int(opt.get_conf(conf,'PRED','npred')[0]) for day in range(ndays): # loop over time: args['day']=day err,fig,info=plt_wind(conf,plconf,date,FA,nest,**args) Err+=[err] if not err: # save: if save: if tag: Tag='_'+tag else: Tag=tag savename='wind_%s_%s_%d_n%d%s' % (date.strftime('%Y%m%d'),FA,day,nest,Tag) Y,M,D=date.year,date.month,date.day Ydest = os.path.join(pltpath,'%s' % Y ) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) ) if not os.path.isdir(MDdest): os.mkdir(MDdest) savename=os.path.join(MDdest,savename+'.'+Figure['extension'][ifig]) Out+=[savename] pl.savefig(savename,dpi=pl.gcf().dpi) if clearfig: fig.clear() if closefig: pl.close(fig) return Err,Out
def clean_frc(cf,date1,date2,type,FA,nest=0,clean=False,quiet=False,output=sys.stdout): date=date1 while date<=date2: f=opt.nameof('in',type,date,FA,nest,cf) if os.path.isfile(f): if clean: if not quiet: print >>output,'Removing ',date,' ', f os.remove(f) else: print >>output,date,' ',FA,' no file',f date=dateu.next_date(date,1)
def find_last(type='rout',FA='a',nest=0,cf=CONF): kargs={'date':'*','FA':FA,'nest':nest,'cf':cf} if type=='rout': name=opt.nameof('out',type,**kargs) elif type=='ini': name=opt.nameof('in', type,**kargs) elif type=='rst': name=opt.nameof('out',type,**kargs) fs=glob.glob(name) if fs: L=name.index('*') date=fs[0][L:L+8] file=fs[0] for i in range(1,len(fs)): if fs[i][L:L+8]>date: date=fs[i][L:L+8] file=fs[i] return dateu.parse_date(date), file else: return '',''
def op_plt_wind_rose(conf, plconf, date, FA='a', nest=0, **kargs): closefig = kargs.get('closefig', True) clearfig = kargs.get('clearfig', True) save = kargs.get('save', True) date = dateu.parse_date(date) Err = [] Out = [] pltpath = opt.nameof('out', 'plots', cf=conf) Data, err = opt.get_plconf(plconf, 'WINDR') ifig = -1 for tag in Data['tag']: ifig += 1 args = {} args['ifig'] = ifig err, figs, info = plt_wind_rose(conf, plconf, date, FA, nest, **args) if not err: # save: if save: if tag: Tag = '_' + tag else: Tag = tag tmp = dateu.parse_date(date) Y, M, D = tmp.year, tmp.month, tmp.day Ydest = os.path.join(pltpath, '%s' % Y) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D)) if not os.path.isdir(MDdest): os.mkdir(MDdest) N = -1 for fig in figs: N += 1 place, day = info[N] savename = 'wind_rose_%s_%s_%d_%s_n%d%s' % ( date, FA, day, place, nest, Tag) savename = os.path.join( MDdest, savename + '.' + Data['extension'][ifig]) Out += [savename] fig.savefig(savename, dpi=fig.dpi) if clearfig: fig.clear() if closefig: pl.close(fig) return Err, Out
def plt0(cf,pcf): title=opt.atts_info(cf)['title'] ''' Plot grids ''' pltpath=opt.nameof('out','plots',cf=cf) grd = glob(opt.nameof('in','grd',cf=cf))[0] if not os.path.isfile(grd): print ':: grid file not found' return # figure tags: out, err=opt.get_plconf(pcf,'FIGURE','tag') for i in range(len(out)): m,fig,ax=plt_grid(pcf,grd,ifig=i) savename='plt0' if out[i]: savename=savename+'_%s' % (out[i]) savename=os.path.join(pltpath,savename+'.png') pl.savefig(savename,dpi=pl.gcf().dpi) print 'saving %s' % savename
def plt0(cf, pcf): title = opt.atts_info(cf)['title'] ''' Plot grids ''' pltpath = opt.nameof('out', 'plots', cf=cf) grd = glob(opt.nameof('in', 'grd', cf=cf))[0] if not os.path.isfile(grd): print ':: grid file not found' return # figure tags: out, err = opt.get_plconf(pcf, 'FIGURE', 'tag') for i in range(len(out)): m, fig, ax = plt_grid(pcf, grd, ifig=i) savename = 'plt0' if out[i]: savename = savename + '_%s' % (out[i]) savename = os.path.join(pltpath, savename + '.png') pl.savefig(savename, dpi=pl.gcf().dpi) print 'saving %s' % savename
def op_plt_wind_rose(conf,plconf,date,FA='a',nest=0,**kargs): closefig = kargs.get('closefig',True) clearfig = kargs.get('clearfig',True) save = kargs.get('save',True) date=dateu.parse_date(date) Err=[] Out=[] pltpath = opt.nameof('out','plots',cf=conf) Data,err = opt.get_plconf(plconf,'WINDR') ifig=-1 for tag in Data['tag']: ifig+=1 args={} args['ifig']=ifig err,figs,info=plt_wind_rose(conf,plconf,date,FA,nest,**args) if not err: # save: if save: if tag: Tag='_'+tag else: Tag=tag tmp=dateu.parse_date(date) Y,M,D=tmp.year,tmp.month,tmp.day Ydest = os.path.join(pltpath,'%s' % Y ) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) ) if not os.path.isdir(MDdest): os.mkdir(MDdest) N=-1 for fig in figs: N+=1 place,day=info[N] savename='wind_rose_%s_%s_%d_%s_n%d%s' % (date,FA,day,place,nest,Tag) savename=os.path.join(MDdest,savename+'.'+Data['extension'][ifig]) Out+=[savename] fig.savefig(savename,dpi=fig.dpi) if clearfig: fig.clear() if closefig: pl.close(fig) return Err,Out
def gen_rivfrc(date,FA='a',nest=0,cf=CONF): date=dateu.parse_date(date) err='' isFatal=False fname=opt.nameof('in','frc',date=date,FA=FA,nest=nest,cf=cf) grd=opt.nameof('in','grd',cf=cf) if os.path.isfile(fname): err='RIVERS file already exists' isFatal=False else: nforec=opt.n_pred(cf) import get_rivers date1=None if FA=='f': date1=dateu.parse_date(dateu.next_date(date,nforec)) try: err=get_rivers.gen_frc(fname,grd,date,date1) except: err='ERROR creating rivers file' if err: isFatal=True return err, isFatal, fname
def op_plt_flt(conf, plconf, date, FA='f', nest=0, **kargs): closefig = kargs.get('closefig', True) clearfig = kargs.get('clearfig', True) save = kargs.get('save', True) date = dateu.parse_date(date) Figure, err = opt.get_plconf(plconf, 'FIGURE') Err = [] Out = [] pltpath = opt.nameof('out', 'plots', cf=conf) ifig = -1 for tag in Figure['tag']: ifig += 1 args = {} args['ifig'] = ifig err, fig, info = plt_flt(conf, plconf, date, FA, nest, **args) Err += [err] if not err: # save: if save: if tag: Tag = '_' + tag else: Tag = tag savename = 'floats_%s_%s_n%d%s' % (date, FA, nest, Tag) Y, M, D = date.year, date.month, date.day, Ydest = os.path.join(pltpath, '%s' % Y) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D)) if not os.path.isdir(MDdest): os.mkdir(MDdest) savename = os.path.join( MDdest, savename + '.' + Figure['extension'][ifig]) Out += [savename] pl.savefig(savename, dpi=pl.gcf().dpi) if clearfig: fig.clear() if closefig: pl.close(fig) return Err, Out
def op_plt_flt(conf,plconf,date,FA='f',nest=0,**kargs): closefig = kargs.get('closefig',True) clearfig = kargs.get('clearfig',True) save = kargs.get('save',True) date=dateu.parse_date(date) Figure,err = opt.get_plconf(plconf,'FIGURE') Err=[] Out=[] pltpath = opt.nameof('out','plots',cf=conf) ifig=-1 for tag in Figure['tag']: ifig+=1 args={} args['ifig']=ifig err,fig,info=plt_flt(conf,plconf,date,FA,nest,**args) Err+=[err] if not err: # save: if save: if tag: Tag='_'+tag else: Tag=tag savename='floats_%s_%s_n%d%s' % (date,FA,nest,Tag) Y,M,D=date.year,date.month,date.day, Ydest = os.path.join(pltpath,'%s' % Y ) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) ) if not os.path.isdir(MDdest): os.mkdir(MDdest) savename=os.path.join(MDdest,savename+'.'+Figure['extension'][ifig]) Out+=[savename] pl.savefig(savename,dpi=pl.gcf().dpi) if clearfig: fig.clear() if closefig: pl.close(fig) return Err,Out
def plt0_wind_rose(conf, plconf): figs = [] Data, err = opt.get_plconf(plconf, 'WINDR') Places, err = opt.get_plconf(plconf, 'WINDR_PLACES') Tag = Data['tag'] ifig = -1 for tag in Tag: ifig += 1 figpos = Data['fig_size'][ifig] axpos = Data['ax_pos'][ifig] fontsize = Data['fontsize'][ifig] linewidth = Data['linewidth'][ifig] legType = Data['legtype'][ifig] intensities = Data['intensities'][ifig] percentages = Data['percentages'][ifig] percentages = [100] args = { 'fontsize': fontsize, 'linewidth': linewidth, 'figpos': figpos, 'axpos': axpos, 'legtype': legType, 'labels': 0 } D = [] F = [] tmp = pl_plots.wind_rose(D, F, di=intensities, ci=percentages, **args) figs += [tmp] # save: pltpath = opt.nameof('out', 'plots', cf=conf) n = -1 names = [] for f in figs: savename = 'plt0_wr' n += 1 if Tag[n]: savename = savename + '_%s' % (Tag[n]) savename = os.path.join(pltpath, savename + '.' + Data['extension'][n]) f.savefig(savename, dpi=f.dpi) names += [savename] pl.close(f) return names
def list_files(cf, date1, date2, io, type, FA, nest=0, quiet=True): files = cb.odict() date = date1 while date <= date2: f = opt.nameof(io, type, date, FA, nest, cf) if os.path.isfile(f): files[date] = f else: files[date] = False date = dateu.next_date(date, 1) if not quiet: for d in files.keys(): if files[d]: f = files[d] hs = cb.hsize(os.path.getsize(f)) print d, ' ', f, ' ', hs[0], hs[1] else: print d, ' no file' return files
def list_files(cf,date1,date2,io,type,FA,nest=0,quiet=True): files=cb.odict() date=date1 while date<=date2: f=opt.nameof(io,type,date,FA,nest,cf) if os.path.isfile(f): files[date]=f else: files[date]=False date=dateu.next_date(date,1) if not quiet: for d in files.keys(): if files[d]: f=files[d] hs=cb.hsize(os.path.getsize(f)) print d,' ', f, ' ',hs[0],hs[1] else: print d,' no file' return files
def clean_frc(cf, date1, date2, type, FA, nest=0, clean=False, quiet=False, output=sys.stdout): date = date1 while date <= date2: f = opt.nameof('in', type, date, FA, nest, cf) if os.path.isfile(f): if clean: if not quiet: print >> output, 'Removing ', date, ' ', f os.remove(f) else: print >> output, date, ' ', FA, ' no file', f date = dateu.next_date(date, 1)
def clean_nc_files(cf,date1,date2,type,FA,nest=0,mdkeep=0,wkeep=-1,clean=False,quiet=False,output=sys.stdout): ''' mdkeep: day,month to keep ex: mdkeep=1 => keep day 1 of every month ex: mdkeep=(1,1) => keep day 1 of January (month,day) ex: mdkeep=0 => no keep wkeep: day of week to keep: ex: wkeep=0 => keep first day of week (synday) ex: wkeep=-1 => no keep ''' date=date1 while date<=date2: f=opt.nameof('out',type,date,FA,nest,cf) if os.path.isfile(f): hs=cb.hsize(os.path.getsize(f)) y,m,d=dateu.parse_date(date) dweek=dateu.parse_date(date).weekday() if mdkeep==-1: MDkeep=dateu.mndays(y,m) # last day of month, then calc last day: else: MDkeep=mdkeep if MDkeep and MDkeep==d or MDkeep==(m,d): if not quiet: print >>output,'*Keeping ',date,' ', f, ' ',hs[0],hs[1],'**', MDkeep elif wkeep!=-1 and wkeep==dweek: if not quiet: print >>output,'*Keeping ',date,' ', f, ' ',hs[0],hs[1],'*', wkeep else: if not quiet: if clean: print >>output,'Removing ',date,' ', f, ' ',hs[0],hs[1] else: print >>output,'Not removing ',date,' ', f, ' ',hs[0],hs[1] if clean: os.remove(f) else: print >>output,date,' ',FA,' no file' date=dateu.next_date(date,1)
def plt0_wind_rose(conf,plconf): figs=[] Data,err = opt.get_plconf(plconf,'WINDR') Places,err = opt.get_plconf(plconf,'WINDR_PLACES') Tag=Data['tag'] ifig=-1 for tag in Tag: ifig+=1 figpos = Data['fig_size'][ifig] axpos = Data['ax_pos'][ifig] fontsize = Data['fontsize'][ifig] linewidth = Data['linewidth'][ifig] legType = Data['legtype'][ifig] intensities = Data['intensities'][ifig] percentages = Data['percentages'][ifig] percentages=[100] args={'fontsize':fontsize,'linewidth':linewidth,'figpos':figpos,'axpos':axpos,'legtype':legType,'labels':0} D=[] F=[] tmp=pl_plots.wind_rose(D,F,di=intensities,ci=percentages,**args) figs+=[tmp] # save: pltpath = opt.nameof('out','plots',cf=conf) n=-1 names=[] for f in figs: savename='plt0_wr' n+=1 if Tag[n]: savename=savename+'_%s' % (Tag[n]) savename=os.path.join(pltpath,savename+'.'+Data['extension'][n]) f.savefig(savename,dpi=f.dpi) names+=[savename] pl.close(f) return names
def zip_plots(cf, year, month, clean=False, quiet=False, overwrite=False, output=sys.stdout): pltpath = opt.nameof('out', 'plots', cf=cf) p = os.path.join(pltpath, '%s' % year, '%02d_*' % month) folders = glob.glob(p) folders.sort() monthn = dateu.month_names(month).lower() zipfile = 'plots_%s_%d.tar.gz' % (monthn, year) zipfile = os.path.join(pltpath, '%s' % year, zipfile) if os.path.isfile(zipfile) and not overwrite: if not quiet: print >> output, 'zip file % s already exist' % zipfile return # create zip: if folders: cb.tar_gz_dir(folders, zipfile) if not quiet: if folders: print >> output, 'Created tar.gz %s with contents:' % zipfile for i in folders: print >> output, ' %s' % i else: print >> output, 'No tar.gz created for %d %02d' % (year, month) # remove original files: if clean: for i in folders: if not quiet: print >> output, 'removing %s' % i shutil.rmtree(i)
def plt_flt(conf,plconf,date,FA='f',nest=0,**kargs): err = '' fig = False info = '' ifig = kargs.get('ifig',0) quiet = kargs.get('quiet',0) date=dateu.parse_date(date) # find input files: args={'cf':conf,'date':date,'FA':FA,'nest':nest} flt = opt.nameof('out','flt',**args) grd = opt.nameof('in','grd',**args) if not os.path.isfile(flt): err='FLT file not found (%s)' % flt return err,fig,info if not os.path.isfile(grd): err='Grid file not found (%s)' % grd return err,fig,info date=dateu.parse_date(date) # plot grid: proj,fig = plt_grid(plconf,grd,ifig) Data,err = opt.get_plconf(plconf,'FLOATS') color = Data['color'][ifig] width = Data['width'][ifig] marker = Data['marker'][ifig] mfcolor = Data['markerFaceColor'.lower()][ifig] mecolor = Data['markerEdgeColor'.lower()][ifig] mewidth = Data['markerEdgeWidth'.lower()][ifig] msize = Data['markerSize'.lower()][ifig] f=roms.Flt(flt,grd) ntimes,npos=f.lon.shape x,y=f.lon[...],f.lat[...] x=np.ma.masked_where(x>1e3,x) x,y=proj(x,y) # initial locations: pl.plot(x[0,:],y[0,:],linewidth=0,marker=marker,mec=mecolor,mfc=mfcolor,ms=msize, mew=mewidth) # all trajectories: for i in range(npos): pl.plot(x[:,i],y[:,i],linewidth=width,color=color) # tilte: Title=opt.get_plconf(plconf,'AXES','title') if Title[ifig]: simpleTitle=1 rdate=date.strftime('%d-%m-%Y') Ndays=f.tdays[-1]-f.tdays[0] title='drifters %s after %s (%4.2f days)' % (FA,rdate,Ndays) if simpleTitle: title='drifters after %s (%4.2f days)' % (rdate,Ndays) pl.title(title) # lims change in some mpl versions !! pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax]) return err,fig,info
def plt_wind_rose(conf, plconf, date, FA='a', nest=0, **kargs): err = '' fig = [] info = [] ifig = kargs.get('ifig', 0) quiet = kargs.get('quiet', 0) place = kargs.get('place', False) day = kargs.get('day', 'all') date = dateu.parse_date(date) # find input files: args = {'cf': conf, 'date': date, 'FA': FA, 'nest': nest} atm = opt.nameof('in', 'blk', **args) grd = opt.nameof('in', 'grd', **args) if not os.path.isfile(atm): err = 'ATM file not found (%s)' % atm return err, fig, info if not os.path.isfile(grd): err = 'Grid file not found (%s)' % grd return err, fig, info # get conf data and places: Data, err = opt.get_plconf(plconf, 'WINDR') Places, err = opt.get_plconf(plconf, 'WINDR_PLACES') figpos = Data['fig_size'][ifig] axpos = Data['ax_pos'][ifig] fontsize = Data['fontsize'][ifig] linewidth = Data['linewidth'][ifig] legType = Data['legtype'][ifig] intensities = Data['intensities'][ifig] percentages = Data['percentages'][ifig] Title = Data['title'][ifig] labels = Data['labels'][ifig] places = {} for k in Places.keys(): places[k] = Places[k][ifig] # get data from atm file: f = roms.Blk(atm, grd) for k in places.keys(): if place and place != k.strip('_'): continue lon, lat = places[k][:2] Ndays = int(np.ceil(f.tdays[-1] - f.tdays[0])) if day == 'all': Days = range(Ndays) else: Days = [day] for Day in Days: time, u, v = f.get('wind_ts', lon=lon, lat=lat, day=Day) # calc angle and intensity: D = np.arctan2(v, u) * 180 / np.pi F = np.sqrt(u**2 + v**2) # wind_rose: args = { 'fontsize': fontsize, 'linewidth': linewidth, 'figpos': figpos, 'axpos': axpos, 'legtype': legType, 'labels': labels } # tilte: if Title: placeStr = places[k][2] #k.strip('_').replace('_',' ') simpleTitle = 1 rdate = date.strftime('%d-%m-%Y') title = '%s %s %s %d' % (placeStr, rdate, FA, Day) if simpleTitle: # simpler version of title: if FA == 'f': # forecast date: rdate = dateu.next_date(date, Day) rdate = rdate.strftime('%d-%m-%Y') title = '%s %s' % (placeStr, rdate) if FA == 'f': title = title + ' (forec)' args['labtitle'] = title args['lablegend'] = 'wind m/s' tmp = wr.wind_rose(D, F, di=intensities, ci=percentages, **args) fig += [tmp] info += [(k, Day)] return err, fig, info
def clean_ini(cf,date1,date2,FA='a',nest=0,clean=False,quiet=False,output=sys.stdout): '''Create text file with the current ini links If the ini file is a link is can be unlinked; if it is a file it is not removed ! ''' def read_log(f): out=cb.odict() if os.path.isfile(f): L=open(log).readlines() for l in L: tmp=l.split(' ',1) sdate=tmp[0] scontents=tmp[1].rstrip().split(' + ') out[tmp[0]]=scontents return out def gen_log(f,L): i=open(f,'w') keys=L.keys() keys.sort() for d in keys: scontents=sjoin(L[d],' + ') i.write('%s %s\n' % (d,scontents)) i.close() def add2log(f,add): L=read_log(f) L0=L.copy() sdate=add[0] contents=add[1].rstrip() if L.has_key(sdate) and contents not in L[sdate]: L[sdate]+=[contents] #if not quiet: print >>output,' +'+sdate+' '+contents elif not L.has_key(sdate): L[sdate]=[contents] #if not quiet: print >>output,' '+sdate+' '+contents if L!=L0: gen_log(f,L) return True else: return False # file has not changed files=[] date=date1 log='ini_log_%s_%s.txt' % (date1,date2) p=opt.pathof(cf,'inputs','ini') log=os.path.join(p,log) if not quiet: print >>output,'Creating/updating ini log %s' % log HasChanged=False while date<=date2: f=opt.nameof('in','ini',date,FA,nest,cf) if os.path.islink(f): src=os.readlink(f) add=(date,'%s --> %s' % (f,src)) hasChanged=add2log(log,add) HasChanged=HasChanged or hasChanged if clean: # remove link: if not quiet: print >>output,'removing %s' % f os.remove(f) elif os.path.isfile(f): hs=cb.hsize(os.path.getsize(f)) ssize='%s %s' % (str(hs[0]),hs[1]) add=(date,'%s --> %s' % (f,ssize)) hasChanged=add2log(log,add) HasChanged=HasChanged or hasChanged if not quiet: print >>output,date,' keeping ', f, ' ',hs[0],hs[1] else: print >>output,date,' no file' date=dateu.next_date(date,1) if not quiet: if HasChanged: print >>output,' file has changed' else: print >>output,' file has not changed'
def gen_in(date,FA='a',nest=0,cf=CONF): err='' isFatal=False instd=opt.nameof('in','rin0',nest=nest,FA=FA,cf=cf) rin =opt.nameof('in','rin',date,FA,nest,cf=cf) if not os.path.isfile(instd): err='ERROR: standard roms in not found: %s' % instd isFatal=True else: try: s=open(instd,'r').read() epath,exc=opt.nameof_run(cf=cf,FA=FA) RUN=os.path.join(epath,exc) kargs={'date':date,'FA':FA,'nest':nest,'cf':cf} inikargs={'date':date,'FA':'a','nest':nest,'cf':cf} d={'grd': relativepath(RUN, opt.nameof('in', 'grd',**kargs)), 'frc': relativepath(RUN, opt.nameof('in', 'frc',**kargs)), 'blk': relativepath(RUN, opt.nameof('in', 'blk',**kargs)), 'clm': relativepath(RUN, opt.nameof('in', 'clm',**kargs)), 'bry': relativepath(RUN, opt.nameof('in', 'bry',**kargs)), 'ini': relativepath(RUN, opt.nameof('in', 'ini',**inikargs)), 'rst': relativepath(RUN, opt.nameof('out','rst',**kargs)), 'his': relativepath(RUN, opt.nameof('out','his',**kargs)), 'avg': relativepath(RUN, opt.nameof('out','avg',**kargs)), 'flt_in': relativepath(RUN, opt.nameof('in', 'flt',**kargs)), 'flt': relativepath(RUN, opt.nameof('out','flt',**kargs)), 'sta_in': relativepath(RUN, opt.nameof('in', 'sta',**kargs)), 'sta': relativepath(RUN, opt.nameof('out','sta',**kargs)), 'title': opt.atts_info(cf)['title'], 'appcpp': opt.atts_info(cf)['appcpp'], 'bio_in': relativepath(RUN, opt.nameof('in', 'bio',**kargs)), 'dia': relativepath(RUN, opt.nameof('out','dia',**kargs)) } d['dstart']= '%d' % dateu.date_diff(date,'1970-01-01').days # days since 19700101 jobinfo=opt.run_sub_info(cf,date=date,FA=FA) kk='ntilei','ntilej' for k in kk: d[k]=jobinfo[k] for k in d.keys(): s=s.replace('#'+k.upper()+'#',d[k]) fid=open(rin,'w') fid.write(s) fid.close() except: err='ERROR creating roms in file' isFatal=True return err,isFatal, rin
def oof(cf,plconf,date=False,last_date=False,FA='a',env=False): # start email notifications service: emailInfo=opt.email_info(cf=cf) sendEmail=emailInfo['send'] #if sendEmail: sys.stdout=opt.Redirect() env_vars(env) flags=opt.flags_info(cf) if date: date=dateu.parse_date(date) if last_date: last_date=dateu.parse_date(last_date) if not date: # find date-1 for prediction: date,file=find_last(type='rst',cf=cf) if not date: on_error(sendEmail,'ERROR (%s): Cannot find previous file'%FA,emailInfo) return else: print 'Last date = %s from file %s' % (date,file) rout=opt.nameof('out','rout',date=date,FA='a',cf=cf) if is_roms_out_ok(rout): print 'Previous roms out is ok: %s' % rout else: on_error(sendEmail,'ERROR (%s): Last run is not ok %s : %s' % (FA,date,rout),emailInfo) return else: date=dateu.next_date(date,-1) # read dates: start_date,end_date=opt.dates_info(cf) if last_date: end_date=dateu.next_date(last_date,+1) while date >= start_date and date < end_date: # read dates again, possible update may occur. start_date,end_date=opt.dates_info(cf) if last_date: end_date=dateu.next_date(last_date,+1) date=dateu.next_date(date) # check if already runned for that date: # ie, check for rst and check if roms_out is ok: rst=opt.nameof('out','rst',date=date,FA=FA,cf=cf) rout=opt.nameof('out','rout',date=date,FA=FA,cf=cf) if os.path.isfile(rst): print 'Found rst file for %s: %s' % (date,rst) if os.path.isfile(rout): if is_roms_out_ok(rout): print ' previous roms out is ok: %s' % rout else: on_error(sendEmail,'ERROR (%s): Previous roms out is NOT ok: %s' % (FA,rout),emailInfo) break else: print ' roms out for %s not found: NOT CHECKED' % date else: print '\nModel will start from %s' % date # check for atm data for current simulation: if flags['atmfrc'] or flags['atmblk']: atmStat=check_atm(date,FA,cf=cf) else: atmStat=True ## wait for rst in case of fa==F: ##if FA=='f': rstStat=check_rst(date,cf=cf) ##else: rstStat=True rstStat=check_rst(date,cf=cf) # check for bondary data for current simulation: if flags['clmbry']: # this step may take forever !! just let us belive parent model is available #bcStat=check_bc(date,FA,cf=cf) bcStat=True else: bcStat=True now=time.strftime("%Y-%m-%d %H:%M:%S +0",time.gmtime()) if (not atmStat is False) and (not rstStat is False) and (not bcStat is False): rout,dt,runErr=run(date,FA,cf=cf) now=time.strftime("%Y-%m-%d %H:%M:%S +0",time.gmtime()) # check if run was ok: if is_roms_out_ok(rout): msg='NO error %s %s'%(date,FA) Msg=' Run %s %s finished ok [%s] dt=%6.2f' % (date,FA,now,dt) print Msg # make plots: if flags['plots']: err,savenames=op_plot.op_plt(cf,plconf,date,FA) if not all(e=='' for e in err): msg+=' --> ERROR plotting' print ' ERROR plotting : ', for e in err: print e if not all(e=='' for e in savenames): for sv in savenames: print ' Saved plot '+sv elif runErr: on_error(sendEmail,'ERROR (%s): Run %s returned the error msg: %s' % (FA,date,runErr),emailInfo) break else: on_error(sendEmail,'ERROR (%s): Run %s finished with ERROR [%s] dt=%6.2f' % (FA,date,now,dt),emailInfo) break elif atmStat is False: Msg='ERROR (%s): Run %s cannot run (atm data missing) ERROR [%s]' % (FA,date,FA,now) if FA=='a': on_error(sendEmail,Msg,emailInfo) break else: msg='ERROR: atm data missing' print Msg elif rstStat is False: msg='ERROR: rst data missing' Msg='ERROR (%s): Run %s cannot run (atm data missing) ERROR [%s]' % (FA,date,now) print Msg print '\n' if sendEmail: send_email.send(emailInfo['dest'],Msg,msg)
def plt_hslice(conf, plconf, date, FA='a', nest=0, **kargs): err = '' fig = False info = {} type = 'avg' var = 'temp' slice = 'z' ind = -10 time = -1 currents = False dcurr = (3, 3) scurr = 3 lcurr = 0.2 ifig = 0 # closefig = True clim = False quiet = False outStoragePath = False cmap = None norm = None useBar = True # currents are barotropic for 2D vars (like zeta) keys = kargs.keys() if 'type' in keys: type = kargs['type'] if 'var' in keys: var = kargs['var'] if 'slice' in keys: slice = kargs['slice'] if 'ind' in keys: ind = kargs['ind'] if 'time' in keys: time = kargs['time'] if 'currents' in keys: currents = kargs['currents'] if 'dcurr' in keys: dcurr = kargs['dcurr'] if 'scurr' in keys: scurr = kargs['scurr'] if 'lcurr' in keys: lcurr = kargs['lcurr'] if 'ifig' in keys: ifig = kargs['ifig'] if 'closefig' in keys: closefig = kargs['closefig'] if 'clim' in keys: clim = kargs['clim'] if 'quiet' in keys: quiet = kargs['quiet'] if 'ostorage' in keys: outStoragePath = kargs['ostorage'] if 'cmap' in keys: cmap = kargs['cmap'] if 'usebar' in keys: useBar = kargs['usebar'] if 'norm' in keys: norm = kargs['norm'] date = dateu.parse_date(date) # find input files: args = { 'cf': conf, 'date': date, 'FA': FA, 'nest': nest, 'ostorage': outStoragePath } his = opt.nameof('out', type, **args) clm = opt.nameof('in', 'clm', **args) grd = opt.nameof('in', 'grd', **args) if not os.path.isfile(his): err = 'Main file not found (%s)' % his return err, fig, info if not os.path.isfile(grd): err = 'Grid file not found (%s)' % grd return err, fig, info r = roms.His(his, grd) # plot grid: proj, fig, ax = plt_grid(plconf, grd, ifig) def add_colorbar(handle, **args): ax = pl.gca() Data, err = opt.get_plconf(plconf, 'AXES') cbpos = Data['cbpos'][ifig] cbbgpos = Data['cbbgpos'][ifig] cbbgc = Data['cbbgcolor'][ifig] cbbga = Data['cbbgalpha'][ifig] cblab = Data['cblabel'][ifig] # colorbar bg axes: if cbbgpos: rec = pl.axes((cbpos[0] - cbpos[2] * cbbgpos[0], cbpos[1] - cbbgpos[2] * cbpos[3], cbpos[2] * (1 + cbbgpos[0] + cbbgpos[1]), cbpos[3] * (1 + cbbgpos[2] + cbbgpos[3])), axisbg=cbbgc, frameon=1) rec.patch.set_alpha(cbbga) rec.set_xticks([]) rec.set_yticks([]) for k in rec.axes.spines.keys(): rec.axes.spines[k].set_color(cbbgc) rec.axes.spines[k].set_alpha(cbbga) # colorbar: if cbpos: cbax = fig.add_axes(cbpos) if cbpos[2] > cbpos[3]: orient = 'horizontal' else: orient = 'vertical' cb = pl.colorbar(handle, cax=cbax, orientation=orient, drawedges=0, **args) pl.axes(ax) # colorbar label: if cblab: Data, err = opt.get_plconf(plconf, 'HSLICES') varnames = Data['varnames'][ifig].split(',') vnames = Data['vnames'][ifig].split(',') lab = '' for i in range(len(varnames)): if varnames[i].strip() == var: lab = vnames[i].strip() break if lab: if r.hasz(var): if slice == 'k': if ind == 0: lab = 'Bottom ' + lab elif ind in (-1, 'surface'): lab = 'Surface ' + lab elif slice == 'z': lab = lab + ' ' + str(ind) + 'm' cb.set_label(lab) def add_currkey(handle): Data, err = opt.get_plconf(plconf, 'HSLICES') pos = Data['kcurrpos'][ifig] if pos: pl.quiverkey(handle, pos[0], pos[1], lcurr, '%s m/s' % str(lcurr), labelpos='S', coordinates='axes') # hslice: if var: if slice == 'k': metodo = r.slicek elif slice == 'z': metodo = r.slicez x, y, z, v = metodo(var, ind, time, plot=False) x, y = proj(x, y) # cmap: if isinstance(cmap, basestring): try: cmap = pl.cm.cmap_d[cmap] except: try: from okean import pl_tools cmap = pl_tools.cm.cmap_d[cmap] except: cmap = pl.cm.jet # original data from clm if slice == 'k' and ind in ( -1, ) and var + '_original' in netcdf.varnames(clm): tcurr = r.datetime[time] x_o = netcdf.use(clm, 'x_original') y_o = netcdf.use(clm, 'y_original') x_o, y_o = proj(x_o, y_o) v_o = netcdf.use(clm, 'y_original') t_o = netcdf.nctime(clm, 'clim_time') # average to current time: i0, = np.where(t_o <= tcurr)[-1] i1, = np.where(t_o > tcurr)[0] v_o0 = netcdf.use(clm, var + '_original', time=i0) v_o1 = netcdf.use(clm, var + '_original', time=i1) # avg: a = tcurr - t_o[i0] b = t_o[i1] - tcurr a = a.days * 86400 + a.seconds b = b.days * 86400 + b.seconds if a == 0: v_o = v_o0 elif b == 0: v_o = v_o1 else: v_o = (v_o0 * b + v_o1 * a) / (a + b) pch = pl.pcolormesh(x_o, y_o, v_o, shading='flat', cmap=cmap) if clim: pl.clim(clim[0], clim[1]) if norm == 'log': from matplotlib.colors import LogNorm Norm = LogNorm(vmin=clim[0], vmax=clim[1]) else: Norm = None # change hypoxia colorbar/cmap if var == 'dye_01': HypoxiaLim = 135 from okean import pl_tools cmap = pl_tools.ucmaps().gen_oxygen( v=(0, HypoxiaLim, 300.)) # default is 0,135,300 !! pch = pl.pcolormesh(x, y, v, shading='flat', cmap=cmap, norm=Norm) if clim: pl.clim(clim[0], clim[1]) # hypoxia: if var == 'dye_01' and ind == 0 and ifig == 0: cond = v < 135. cond = v < HypoxiaLim cond = (v < HypoxiaLim) & (r.grid.h > 5) pm = r.grid.use('pm') pn = r.grid.use('pn') A = (1 / pm[cond] * 1 / pn[cond] / 1e6).sum() x_, y_ = proj(-98, 29.5) pl.text(x_, y_, 'Hypoxia area = %.0f km$^2$' % A, color='r', fontweight='bold', fontname='monospace', bbox=dict(edgecolor='none', facecolor='white', alpha=0.8)) # hypoxia. # colorbar: if norm == 'log': tks = 10**np.linspace(np.log10(clim[0]), np.log10(clim[1]), 4) opts = {'ticks': tks, 'format': '%.2f'} else: opts = {'ticks': None} add_colorbar(pch, **opts) if currents: if (var and r.hasz(var)) or not useBar: uvind = ind else: uvind = 'bar' x, y, z, u, v = r.sliceuv(uvind, time) xm, ym = proj(x, y) mm = np.zeros(x.shape, 'bool') mm[::dcurr[0], ::dcurr[1]] = True Data, err = opt.get_plconf(plconf, 'HSLICES') wcurr = Data['wcurr'][ifig] acurr = Data['acurr'][ifig] qvopts = {'units': 'x', 'scale': scurr, 'width': wcurr, 'alpha': acurr} if var: q = pl.quiver(xm[mm], ym[mm], u[mm], v[mm], **qvopts) else: s = np.sqrt(u**2 + v**2) q = pl.quiver(xm[mm], ym[mm], u[mm], v[mm], s[mm], **qvopts) if clim: pl.clim(clim[0], clim[1]) add_colorbar(q) add_currkey(q) # store some info that may be required later info['hasz'] = False if var and r.hasz(var): info['hasz'] = True # logo: if ifig == 0: im = os.path.join(os.path.dirname(__file__), 'logo_INOCAR.png') i = pl.imread(im) h, w = i.shape[:2] rx = .12 W = (proj.xmax - proj.xmin) * rx H = W * h / w l = proj.xmax #pl.fill([proj.xmax-W, proj.xmax, proj.xmax, proj.xmax-W], # [proj.ymin, proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H], # '#500000',alpha=0.25,ec='none') ax.imshow(i, extent=(proj.xmax * .98 - W, proj.xmax * .98, proj.ymin + H * .1, proj.ymin + H * 1.1), zorder=1e3) #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF', # fontdict={'size':14,'family':'serif'}, # color='#500000',ha='center',weight='bold') pl.text(proj.xmax * .8, proj.ymax * (-.1), r.datetime[time].strftime("%d %b %Y"), fontdict={ 'size': 11, 'family': 'monospace' }, ha='center') if FA == 'f': s = 'Pronostico desde %s' % r.datetime[0].strftime("%d %b %Y") pl.text( proj.xmax * .8, proj.ymax * (-.15), s, #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s, fontdict={'fontsize': 10}, ha='center') # logo. # lims change in some mpl versions !! pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax]) return err, fig, info
def plt_wind(conf,plconf,date,FA='a',nest=0,**kargs): err = '' fig = False info = '' ifig = kargs.get('ifig',0) day = kargs.get('day',0) quiet = kargs.get('quiet',0) time=day date=dateu.parse_date(date) # find input files: args={'cf':conf,'date':date,'FA':FA,'nest':nest} atm = opt.nameof('in','blk',**args) grd = opt.nameof('in','grd',**args) if not os.path.isfile(atm): err='ATM file not found (%s)' % atm return err,fig,info if not os.path.isfile(grd): err='Grid file not found (%s)' % grd return err,fig,info Data,err = opt.get_plconf(plconf,'WIND') dcurr=Data['dcurr'][ifig] lcurr=Data['lcurr'][ifig] scurr=Data['scurr'][ifig] clim =Data['clim'][ifig] tind = Data['time'][ifig] x=netcdf.use(grd,'lon_rho') y=netcdf.use(grd,'lat_rho') wtime=netcdf.nctime(atm,'time') cnd=(wtime>=date+datetime.timedelta(days=day))&(date<date+datetime.timedelta(days=day+1)) u=netcdf.use(atm,'Uwind',time=cnd) v=netcdf.use(atm,'Uwind',time=cnd) if tind=='dailyMean': u=u.mean(0) v=v.mean(0) sdate=wtime[cnd][0] # for title... 1st day 00h is expected to be 1st date, # or model should not run! else: # tind of some day, ex: tind 0 from forec day 3 u=u[tind] v=v[tind] sdate=wtime[cnd][tind] if day>len(u)-1: err='Invalid day %d (max=%d)' % (day,len(u)-1) return err,fig,info # plot grid: proj,fig,ax= plt_grid(plconf,grd,ifig) # no mask on land: mask=np.zeros(u.shape,'bool') mask[::dcurr[0],::dcurr[1]]=True xm, ym = proj(x,y) s=np.sqrt(u**2+v**2) q=pl.quiver(xm[mask],ym[mask],u[mask],v[mask],s[mask],scale=scurr,zorder=100) pl.clim(clim[0],clim[1]) def add_colorbar(handle,**args): ax=pl.gca() Data,err = opt.get_plconf(plconf,'AXES') cbpos = Data['cbpos'][ifig] cbbgpos = Data['cbbgpos'][ifig] cbbgc = Data['cbbgcolor'][ifig] cbbga = Data['cbbgalpha'][ifig] cblab = Data['cblabel'][ifig] # colorbar bg axes: if cbbgpos: rec=pl.axes((cbpos[0]-cbpos[2]*cbbgpos[0],cbpos[1]-cbbgpos[2]*cbpos[3], cbpos[2]*(1+cbbgpos[0]+cbbgpos[1]),cbpos[3]*(1+cbbgpos[2]+cbbgpos[3])), axisbg=cbbgc,frameon=1) rec.patch.set_alpha(cbbga) rec.set_xticks([]) rec.set_yticks([]) for k in rec.axes.spines.keys(): rec.axes.spines[k].set_color(cbbgc) rec.axes.spines[k].set_alpha(cbbga) # colorbar: if cbpos: cbax=fig.add_axes(cbpos) if cbpos[2]>cbpos[3]: orient='horizontal' else: orient='vertical' cb=pl.colorbar(handle,cax=cbax,orientation=orient,drawedges=0,**args) pl.axes(ax) # colorbar label: cb.set_label(r'Wind Speed [m s$^{\rm{-1}}$]') def add_currkey(handle): pos=Data['kcurrpos'][ifig] if pos: pl.quiverkey(handle, pos[0], pos[1], lcurr, '%s m/s' % str(lcurr),labelpos='S', coordinates='axes') add_colorbar(q) add_currkey(q) # tilte: Title,err=opt.get_plconf(plconf,'AXES','title') if Title[ifig]: simpleTitle=1 rdate=date.strftime('%d-%m-%Y') title='wind %s %s %d' % (rdate,FA,day) if simpleTitle: # simpler version of title: if FA=='f': # forecast date: rdate=dateu.next_date(date,day); rdate=rdate.strftime('%d-%m-%Y') title='wind %s' % (rdate) if FA=='f': title=title+' (forec)' pl.title(title) # logo: if ifig==0: im=os.path.join(os.path.dirname(__file__),'logo_INOCAR.png') i=pl.imread(im) h,w=i.shape[:2] rx=.12 W=(proj.xmax- proj.xmin)*rx H=W*h/w l=proj.xmax #pl.fill([proj.xmax-W, proj.xmax, proj.xmax, proj.xmax-W], # [proj.ymin, proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H], # '#500000',alpha=0.25,ec='none') ax.imshow(i,extent=(proj.xmax*.98-W,proj.xmax*.98, proj.ymin+H*.1, proj.ymin+H*1.1),zorder=1e3) #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF', # fontdict={'size':14,'family':'serif'}, # color='#500000',ha='center',weight='bold') pl.text(proj.xmax*.8, proj.ymax*(-.1),sdate.strftime("%d %b %Y"), #pl.text(proj.xmax*.62, proj.ymax*.93,sdate.strftime("%d %b %Y"), fontdict={'size':13,'family':'monospace'},ha='center') # change date format if tind is not daily mean, ie, add hour, etc if FA=='f': s='Pronostico desde %s' % date.strftime("%d %b %Y") pl.text(proj.xmax*.8, proj.ymax*(-.15),s, ##this is outside #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s, ##this is in the proj (inside) fontdict={'fontsize':10},ha='center') # logo. # lims change in some mpl versions !! pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax]) return err,fig,info
def op_plt_hslice(conf, plconf, date, FA, nest=0, **kargs): closefig = kargs.get('closefig', True) clearfig = kargs.get('clearfig', True) save = kargs.get('save', True) Varname = kargs.get('vname', False) Depth = kargs.get('depth', False) date = dateu.parse_date(date) Err = [] Out = [] pltpath = opt.nameof('out', 'plots', cf=conf) Figure, err = opt.get_plconf(plconf, 'FIGURE') Hslices, err = opt.get_plconf(plconf, 'HSLICES') Title, err = opt.get_plconf(plconf, 'AXES', 'title') def iterv(v): try: len(v) except: v = [v] return v for i in range(len(Figure.values()[0])): # loop figures Varnames = Hslices['varnames'][i].split(',') Varnames = [s.strip() for s in Varnames] depths = Hslices['depths'][i] addcurr = Hslices['addcurr'][i] # clims = Hslices['clim'][i] depths = iterv(depths) addcurr = iterv(addcurr) # clims = iterv(clims) kargs = {} kargs['ifig'] = i kargs['type'] = Hslices['input'][i] #kargs['time']=Inputs['time'][i] TIMES = Hslices['time'][i] kargs['dcurr'] = Hslices['dcurr'][i] kargs['scurr'] = Hslices['scurr'][i] kargs['lcurr'] = Hslices['lcurr'][i] if Varname: varnames = [Varname] else: varnames = Varnames for var in varnames: # loop variables var = var.strip() nv = Varnames.index(var) kargs['cmap'] = Hslices['cmap'][i].split(',')[nv].strip() kargs['norm'] = Hslices['norm'][i].split(',')[nv].strip() kargs['var'] = var vdepths = depths[nv] try: iter(vdepths) except: vdepths = [vdepths] if Depth: vdepths = [Depth] nz = -1 for z in vdepths: # loop depths nz += 1 if z in ('s', 'surf', 'surface') or z >= 0: kargs['ind'] = z kargs['slice'] = 'k' else: kargs['ind'] = z kargs['slice'] = 'z' cl = opt.get_clims(date, var, z, plconf)[i] kargs['clim'] = cl for addc in addcurr: # add/no currents kargs['currents'] = addc # loop over time: if TIMES == 'all': if FA == 'a': times = [-1] else: times = range( int(opt.get_conf(conf, 'PRED', 'npred')[0])) else: times = [TIMES] for it in times: kargs['time'] = it e, fig, info = plt_hslice(conf, plconf, date, FA, nest, **kargs) Err += [e] if not e: if var: svar = var else: svar = '' if addc: scurr = 'curr' else: scurr = '' if info['hasz']: sslice = kargs['slice'] + '_' + str( kargs['ind']) else: sslice = '' if date.hour > 0: sdate = date.strftime('%Y%m%d_%H') else: sdate = date.strftime('%Y%m%d') savename = '%s_%s_n%d_%s_%d_%s_%s_%s_%s' % ( sdate, FA, nest, kargs['type'], kargs['time'], svar, scurr, sslice, Figure['tag'][i]) if Title[i]: simpleTitle = 1 rdate = date.strftime('%d-%m-%Y') if sslice: sslice = sslice[2:] title = '%s#%s#n%d#%s#%d#%s#%s#%s' % ( rdate, FA, nest, kargs['type'], kargs['time'], svar, scurr, sslice) if simpleTitle: # simpler version of title: if FA == 'f': # forecast date: rdate = dateu.next_date( date, kargs['time']) rdate = date.strftime('%d-%m-%Y') title = '%s#%s#%s#%s' % (rdate, svar, scurr, sslice) if FA == 'f': title = title + ' (forec)' while 1: if title.find('##') > -1: title = title.replace('##', '#') else: break title = title.replace('#', ' ') pl.title(title) while 1: if savename.find('__') > -1: savename = savename.replace('__', '_') else: break savename = savename.strip('_') if save: Y, M, D = date.year, date.month, date.day, Ydest = os.path.join(pltpath, '%s' % Y) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest, '%02d_%02d' % (M, D)) if not os.path.isdir(MDdest): os.mkdir(MDdest) savename = os.path.join( MDdest, savename + '.' + Figure['extension'][i]) Out += [savename] pl.savefig(savename, dpi=pl.gcf().dpi) #pl.savefig(savename,dpi=300) if clearfig: fig.clear() if closefig: pl.close(fig) return Err, Out
def plt_hslice(conf,plconf,date,FA='a',nest=0,**kargs): err='' fig=False info={} type = 'avg' var = 'temp' slice = 'z' ind = -10 time = -1 currents = False dcurr = (3,3) scurr = 3 lcurr = 0.2 ifig = 0 # closefig = True clim = False quiet = False outStoragePath=False cmap = None norm = None useBar = True # currents are barotropic for 2D vars (like zeta) keys=kargs.keys() if 'type' in keys: type = kargs['type'] if 'var' in keys: var = kargs['var'] if 'slice' in keys: slice = kargs['slice'] if 'ind' in keys: ind = kargs['ind'] if 'time' in keys: time = kargs['time'] if 'currents' in keys: currents = kargs['currents'] if 'dcurr' in keys: dcurr = kargs['dcurr'] if 'scurr' in keys: scurr = kargs['scurr'] if 'lcurr' in keys: lcurr = kargs['lcurr'] if 'ifig' in keys: ifig = kargs['ifig'] if 'closefig' in keys: closefig = kargs['closefig'] if 'clim' in keys: clim = kargs['clim'] if 'quiet' in keys: quiet = kargs['quiet'] if 'ostorage' in keys: outStoragePath = kargs['ostorage'] if 'cmap' in keys: cmap = kargs['cmap'] if 'usebar' in keys: useBar = kargs['usebar'] if 'norm' in keys: norm = kargs['norm'] date=dateu.parse_date(date) # find input files: args={'cf':conf,'date':date,'FA':FA,'nest':nest,'ostorage':outStoragePath} his = opt.nameof('out',type,**args) clm = opt.nameof('in','clm',**args) grd = opt.nameof('in','grd',**args) if not os.path.isfile(his): err='Main file not found (%s)' % his return err,fig,info if not os.path.isfile(grd): err='Grid file not found (%s)' % grd return err,fig,info r=roms.His(his,grd) # plot grid: proj,fig, ax = plt_grid(plconf,grd,ifig) def add_colorbar(handle,**args): ax=pl.gca() Data,err = opt.get_plconf(plconf,'AXES') cbpos = Data['cbpos'][ifig] cbbgpos = Data['cbbgpos'][ifig] cbbgc = Data['cbbgcolor'][ifig] cbbga = Data['cbbgalpha'][ifig] cblab = Data['cblabel'][ifig] # colorbar bg axes: if cbbgpos: rec=pl.axes((cbpos[0]-cbpos[2]*cbbgpos[0],cbpos[1]-cbbgpos[2]*cbpos[3], cbpos[2]*(1+cbbgpos[0]+cbbgpos[1]),cbpos[3]*(1+cbbgpos[2]+cbbgpos[3])), axisbg=cbbgc,frameon=1) rec.patch.set_alpha(cbbga) rec.set_xticks([]) rec.set_yticks([]) for k in rec.axes.spines.keys(): rec.axes.spines[k].set_color(cbbgc) rec.axes.spines[k].set_alpha(cbbga) # colorbar: if cbpos: cbax=fig.add_axes(cbpos) if cbpos[2]>cbpos[3]: orient='horizontal' else: orient='vertical' cb=pl.colorbar(handle,cax=cbax,orientation=orient,drawedges=0,**args) pl.axes(ax) # colorbar label: if cblab: Data,err = opt.get_plconf(plconf,'HSLICES') varnames=Data['varnames'][ifig].split(',') vnames=Data['vnames'][ifig].split(',') lab='' for i in range(len(varnames)): if varnames[i].strip()==var: lab=vnames[i].strip() break if lab: if r.hasz(var): if slice=='k': if ind==0: lab = 'Bottom '+lab elif ind in (-1,'surface'): lab = 'Surface '+lab elif slice=='z': lab=lab+' '+str(ind)+'m' cb.set_label(lab) def add_currkey(handle): Data,err = opt.get_plconf(plconf,'HSLICES') pos=Data['kcurrpos'][ifig] if pos: pl.quiverkey(handle, pos[0], pos[1], lcurr, '%s m/s' % str(lcurr),labelpos='S', coordinates='axes') # hslice: if var: if slice=='k': metodo=r.slicek elif slice=='z': metodo=r.slicez x,y,z,v=metodo(var,ind,time,plot=False) x,y=proj(x,y) # cmap: if isinstance(cmap,basestring): try:cmap=pl.cm.cmap_d[cmap] except: try: from okean import pl_tools cmap=pl_tools.cm.cmap_d[cmap] except: cmap=pl.cm.jet # original data from clm if slice=='k' and ind in (-1,) and var+'_original' in netcdf.varnames(clm): tcurr= r.datetime[time] x_o=netcdf.use(clm,'x_original') y_o=netcdf.use(clm,'y_original') x_o,y_o=proj(x_o,y_o) v_o=netcdf.use(clm,'y_original') t_o=netcdf.nctime(clm,'clim_time') # average to current time: i0,=np.where(t_o<=tcurr)[-1] i1,=np.where(t_o>tcurr)[0] v_o0=netcdf.use(clm,var+'_original',time=i0) v_o1=netcdf.use(clm,var+'_original',time=i1) # avg: a=tcurr-t_o[i0] b=t_o[i1]-tcurr a=a.days*86400+a.seconds b=b.days*86400+b.seconds if a==0: v_o=v_o0 elif b==0: v_o=v_o1 else: v_o=(v_o0*b+v_o1*a)/(a+b) pch=pl.pcolormesh(x_o,y_o,v_o,shading='flat',cmap=cmap) if clim: pl.clim(clim[0],clim[1]) if norm=='log': from matplotlib.colors import LogNorm Norm=LogNorm(vmin=clim[0],vmax=clim[1]) else: Norm=None # change hypoxia colorbar/cmap if var=='dye_01': HypoxiaLim=135 from okean import pl_tools cmap=pl_tools.ucmaps().gen_oxygen(v=(0,HypoxiaLim,300.)) # default is 0,135,300 !! pch=pl.pcolormesh(x,y,v,shading='flat',cmap=cmap, norm=Norm) if clim: pl.clim(clim[0],clim[1]) # hypoxia: if var=='dye_01' and ind==0 and ifig==0: cond=v<135. cond=v<HypoxiaLim cond=(v<HypoxiaLim)&(r.grid.h>5) pm=r.grid.use('pm') pn=r.grid.use('pn') A=(1/pm[cond]*1/pn[cond]/1e6).sum() x_,y_=proj(-98,29.5) pl.text(x_,y_,'Hypoxia area = %.0f km$^2$' % A,color='r', fontweight='bold',fontname='monospace', bbox=dict(edgecolor='none',facecolor='white', alpha=0.8)) # hypoxia. # colorbar: if norm=='log': tks=10**np.linspace(np.log10(clim[0]),np.log10(clim[1]),4) opts={'ticks':tks,'format':'%.2f'} else: opts={'ticks':None} add_colorbar(pch,**opts) if currents: if (var and r.hasz(var)) or not useBar: uvind=ind else: uvind='bar' x,y,z,u,v=r.sliceuv(uvind,time) xm, ym = proj(x,y) mm=np.zeros(x.shape,'bool') mm[::dcurr[0],::dcurr[1]]=True Data,err = opt.get_plconf(plconf,'HSLICES') wcurr=Data['wcurr'][ifig] acurr=Data['acurr'][ifig] qvopts={'units':'x','scale':scurr,'width':wcurr,'alpha':acurr} if var: q=pl.quiver(xm[mm],ym[mm],u[mm],v[mm],**qvopts) else: s=np.sqrt(u**2+v**2) q=pl.quiver(xm[mm],ym[mm],u[mm],v[mm],s[mm],**qvopts) if clim: pl.clim(clim[0],clim[1]) add_colorbar(q) add_currkey(q) # store some info that may be required later info['hasz']=False if var and r.hasz(var): info['hasz']=True # logo: if ifig==0: im=os.path.join(os.path.dirname(__file__),'logo_INOCAR.png') i=pl.imread(im) h,w=i.shape[:2] rx=.12 W=(proj.xmax- proj.xmin)*rx H=W*h/w l=proj.xmax #pl.fill([proj.xmax-W, proj.xmax, proj.xmax, proj.xmax-W], # [proj.ymin, proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H], # '#500000',alpha=0.25,ec='none') ax.imshow(i,extent=(proj.xmax*.98-W,proj.xmax*.98, proj.ymin+H*.1, proj.ymin+H*1.1),zorder=1e3) #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF', # fontdict={'size':14,'family':'serif'}, # color='#500000',ha='center',weight='bold') pl.text(proj.xmax*.8, proj.ymax*(-.1),r.datetime[time].strftime("%d %b %Y"), fontdict={'size':11,'family':'monospace'},ha='center') if FA=='f': s='Pronostico desde %s' % r.datetime[0].strftime("%d %b %Y") pl.text(proj.xmax*.8, proj.ymax*(-.15),s, #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s, fontdict={'fontsize':10},ha='center') # logo. # lims change in some mpl versions !! pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax]) return err, fig, info
def plt_wind_rose(conf,plconf,date,FA='a',nest=0,**kargs): err = '' fig = [] info = [] ifig = kargs.get('ifig',0) quiet = kargs.get('quiet',0) place = kargs.get('place',False) day = kargs.get('day','all') date=dateu.parse_date(date) # find input files: args={'cf':conf,'date':date,'FA':FA,'nest':nest} atm = opt.nameof('in','blk',**args) grd = opt.nameof('in','grd',**args) if not os.path.isfile(atm): err='ATM file not found (%s)' % atm return err,fig,info if not os.path.isfile(grd): err='Grid file not found (%s)' % grd return err,fig,info # get conf data and places: Data,err = opt.get_plconf(plconf,'WINDR') Places,err = opt.get_plconf(plconf,'WINDR_PLACES') figpos = Data['fig_size'][ifig] axpos = Data['ax_pos'][ifig] fontsize = Data['fontsize'][ifig] linewidth = Data['linewidth'][ifig] legType = Data['legtype'][ifig] intensities = Data['intensities'][ifig] percentages = Data['percentages'][ifig] Title = Data['title'][ifig] labels = Data['labels'][ifig] places={} for k in Places.keys(): places[k]=Places[k][ifig] # get data from atm file: f=roms.Blk(atm,grd) for k in places.keys(): if place and place!=k.strip('_'): continue lon,lat=places[k][:2] Ndays=int(np.ceil(f.tdays[-1]-f.tdays[0])) if day=='all': Days=range(Ndays) else: Days=[day] for Day in Days: time,u,v = f.get('wind_ts',lon=lon,lat=lat,day=Day) # calc angle and intensity: D=np.arctan2(v,u)*180/np.pi F=np.sqrt(u**2+v**2) # wind_rose: args={'fontsize':fontsize,'linewidth':linewidth,'figpos':figpos, 'axpos':axpos,'legtype':legType,'labels':labels} # tilte: if Title: placeStr=places[k][2]#k.strip('_').replace('_',' ') simpleTitle=1 rdate=date.strftime('%d-%m-%Y') title='%s %s %s %d' % (placeStr,rdate,FA,Day) if simpleTitle: # simpler version of title: if FA=='f': # forecast date: rdate=dateu.next_date(date,Day); rdate=rdate.strftime('%d-%m-%Y') title='%s %s' % (placeStr,rdate) if FA=='f': title=title+' (forec)' args['labtitle']=title args['lablegend']='wind m/s' tmp=wr.wind_rose(D,F,di=intensities,ci=percentages,**args) fig+=[tmp] info+=[(k,Day)] return err,fig,info
def plt_flt(conf, plconf, date, FA='f', nest=0, **kargs): err = '' fig = False info = '' ifig = kargs.get('ifig', 0) quiet = kargs.get('quiet', 0) date = dateu.parse_date(date) # find input files: args = {'cf': conf, 'date': date, 'FA': FA, 'nest': nest} flt = opt.nameof('out', 'flt', **args) grd = opt.nameof('in', 'grd', **args) if not os.path.isfile(flt): err = 'FLT file not found (%s)' % flt return err, fig, info if not os.path.isfile(grd): err = 'Grid file not found (%s)' % grd return err, fig, info date = dateu.parse_date(date) # plot grid: proj, fig = plt_grid(plconf, grd, ifig) Data, err = opt.get_plconf(plconf, 'FLOATS') color = Data['color'][ifig] width = Data['width'][ifig] marker = Data['marker'][ifig] mfcolor = Data['markerFaceColor'.lower()][ifig] mecolor = Data['markerEdgeColor'.lower()][ifig] mewidth = Data['markerEdgeWidth'.lower()][ifig] msize = Data['markerSize'.lower()][ifig] f = roms.Flt(flt, grd) ntimes, npos = f.lon.shape x, y = f.lon[...], f.lat[...] x = np.ma.masked_where(x > 1e3, x) x, y = proj(x, y) # initial locations: pl.plot(x[0, :], y[0, :], linewidth=0, marker=marker, mec=mecolor, mfc=mfcolor, ms=msize, mew=mewidth) # all trajectories: for i in range(npos): pl.plot(x[:, i], y[:, i], linewidth=width, color=color) # tilte: Title = opt.get_plconf(plconf, 'AXES', 'title') if Title[ifig]: simpleTitle = 1 rdate = date.strftime('%d-%m-%Y') Ndays = f.tdays[-1] - f.tdays[0] title = 'drifters %s after %s (%4.2f days)' % (FA, rdate, Ndays) if simpleTitle: title = 'drifters after %s (%4.2f days)' % (rdate, Ndays) pl.title(title) # lims change in some mpl versions !! pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax]) return err, fig, info
def plt_wind(conf, plconf, date, FA='a', nest=0, **kargs): err = '' fig = False info = '' ifig = kargs.get('ifig', 0) day = kargs.get('day', 0) quiet = kargs.get('quiet', 0) time = day date = dateu.parse_date(date) # find input files: args = {'cf': conf, 'date': date, 'FA': FA, 'nest': nest} atm = opt.nameof('in', 'blk', **args) grd = opt.nameof('in', 'grd', **args) if not os.path.isfile(atm): err = 'ATM file not found (%s)' % atm return err, fig, info if not os.path.isfile(grd): err = 'Grid file not found (%s)' % grd return err, fig, info Data, err = opt.get_plconf(plconf, 'WIND') dcurr = Data['dcurr'][ifig] lcurr = Data['lcurr'][ifig] scurr = Data['scurr'][ifig] clim = Data['clim'][ifig] tind = Data['time'][ifig] x = netcdf.use(grd, 'lon_rho') y = netcdf.use(grd, 'lat_rho') wtime = netcdf.nctime(atm, 'time') cnd = (wtime >= date + datetime.timedelta(days=day)) & ( date < date + datetime.timedelta(days=day + 1)) u = netcdf.use(atm, 'Uwind', time=cnd) v = netcdf.use(atm, 'Uwind', time=cnd) if tind == 'dailyMean': u = u.mean(0) v = v.mean(0) sdate = wtime[cnd][ 0] # for title... 1st day 00h is expected to be 1st date, # or model should not run! else: # tind of some day, ex: tind 0 from forec day 3 u = u[tind] v = v[tind] sdate = wtime[cnd][tind] if day > len(u) - 1: err = 'Invalid day %d (max=%d)' % (day, len(u) - 1) return err, fig, info # plot grid: proj, fig, ax = plt_grid(plconf, grd, ifig) # no mask on land: mask = np.zeros(u.shape, 'bool') mask[::dcurr[0], ::dcurr[1]] = True xm, ym = proj(x, y) s = np.sqrt(u**2 + v**2) q = pl.quiver(xm[mask], ym[mask], u[mask], v[mask], s[mask], scale=scurr, zorder=100) pl.clim(clim[0], clim[1]) def add_colorbar(handle, **args): ax = pl.gca() Data, err = opt.get_plconf(plconf, 'AXES') cbpos = Data['cbpos'][ifig] cbbgpos = Data['cbbgpos'][ifig] cbbgc = Data['cbbgcolor'][ifig] cbbga = Data['cbbgalpha'][ifig] cblab = Data['cblabel'][ifig] # colorbar bg axes: if cbbgpos: rec = pl.axes((cbpos[0] - cbpos[2] * cbbgpos[0], cbpos[1] - cbbgpos[2] * cbpos[3], cbpos[2] * (1 + cbbgpos[0] + cbbgpos[1]), cbpos[3] * (1 + cbbgpos[2] + cbbgpos[3])), axisbg=cbbgc, frameon=1) rec.patch.set_alpha(cbbga) rec.set_xticks([]) rec.set_yticks([]) for k in rec.axes.spines.keys(): rec.axes.spines[k].set_color(cbbgc) rec.axes.spines[k].set_alpha(cbbga) # colorbar: if cbpos: cbax = fig.add_axes(cbpos) if cbpos[2] > cbpos[3]: orient = 'horizontal' else: orient = 'vertical' cb = pl.colorbar(handle, cax=cbax, orientation=orient, drawedges=0, **args) pl.axes(ax) # colorbar label: cb.set_label(r'Wind Speed [m s$^{\rm{-1}}$]') def add_currkey(handle): pos = Data['kcurrpos'][ifig] if pos: pl.quiverkey(handle, pos[0], pos[1], lcurr, '%s m/s' % str(lcurr), labelpos='S', coordinates='axes') add_colorbar(q) add_currkey(q) # tilte: Title, err = opt.get_plconf(plconf, 'AXES', 'title') if Title[ifig]: simpleTitle = 1 rdate = date.strftime('%d-%m-%Y') title = 'wind %s %s %d' % (rdate, FA, day) if simpleTitle: # simpler version of title: if FA == 'f': # forecast date: rdate = dateu.next_date(date, day) rdate = rdate.strftime('%d-%m-%Y') title = 'wind %s' % (rdate) if FA == 'f': title = title + ' (forec)' pl.title(title) # logo: if ifig == 0: im = os.path.join(os.path.dirname(__file__), 'logo_INOCAR.png') i = pl.imread(im) h, w = i.shape[:2] rx = .12 W = (proj.xmax - proj.xmin) * rx H = W * h / w l = proj.xmax #pl.fill([proj.xmax-W, proj.xmax, proj.xmax, proj.xmax-W], # [proj.ymin, proj.ymin, proj.ymin+2.8*H, proj.ymin+2.8*H], # '#500000',alpha=0.25,ec='none') ax.imshow(i, extent=(proj.xmax * .98 - W, proj.xmax * .98, proj.ymin + H * .1, proj.ymin + H * 1.1), zorder=1e3) #pl.text(proj.xmax-W/2., proj.ymin+2.2*H,'OOF', # fontdict={'size':14,'family':'serif'}, # color='#500000',ha='center',weight='bold') pl.text( proj.xmax * .8, proj.ymax * (-.1), sdate.strftime("%d %b %Y"), #pl.text(proj.xmax*.62, proj.ymax*.93,sdate.strftime("%d %b %Y"), fontdict={ 'size': 13, 'family': 'monospace' }, ha='center') # change date format if tind is not daily mean, ie, add hour, etc if FA == 'f': s = 'Pronostico desde %s' % date.strftime("%d %b %Y") pl.text( proj.xmax * .8, proj.ymax * (-.15), s, ##this is outside #pl.text(proj.xmax-W/2., proj.ymin+1.1*H,s, ##this is in the proj (inside) fontdict={'fontsize': 10}, ha='center') # logo. # lims change in some mpl versions !! pl.gca().axis([proj.xmin, proj.xmax, proj.ymin, proj.ymax]) return err, fig, info
def clean_ini(cf, date1, date2, FA='a', nest=0, clean=False, quiet=False, output=sys.stdout): '''Create text file with the current ini links If the ini file is a link is can be unlinked; if it is a file it is not removed ! ''' def read_log(f): out = cb.odict() if os.path.isfile(f): L = open(log).readlines() for l in L: tmp = l.split(' ', 1) sdate = tmp[0] scontents = tmp[1].rstrip().split(' + ') out[tmp[0]] = scontents return out def gen_log(f, L): i = open(f, 'w') keys = L.keys() keys.sort() for d in keys: scontents = sjoin(L[d], ' + ') i.write('%s %s\n' % (d, scontents)) i.close() def add2log(f, add): L = read_log(f) L0 = L.copy() sdate = add[0] contents = add[1].rstrip() if L.has_key(sdate) and contents not in L[sdate]: L[sdate] += [contents] #if not quiet: print >>output,' +'+sdate+' '+contents elif not L.has_key(sdate): L[sdate] = [contents] #if not quiet: print >>output,' '+sdate+' '+contents if L != L0: gen_log(f, L) return True else: return False # file has not changed files = [] date = date1 log = 'ini_log_%s_%s.txt' % (date1, date2) p = opt.pathof(cf, 'inputs', 'ini') log = os.path.join(p, log) if not quiet: print >> output, 'Creating/updating ini log %s' % log HasChanged = False while date <= date2: f = opt.nameof('in', 'ini', date, FA, nest, cf) if os.path.islink(f): src = os.readlink(f) add = (date, '%s --> %s' % (f, src)) hasChanged = add2log(log, add) HasChanged = HasChanged or hasChanged if clean: # remove link: if not quiet: print >> output, 'removing %s' % f os.remove(f) elif os.path.isfile(f): hs = cb.hsize(os.path.getsize(f)) ssize = '%s %s' % (str(hs[0]), hs[1]) add = (date, '%s --> %s' % (f, ssize)) hasChanged = add2log(log, add) HasChanged = HasChanged or hasChanged if not quiet: print >> output, date, ' keeping ', f, ' ', hs[0], hs[1] else: print >> output, date, ' no file' date = dateu.next_date(date, 1) if not quiet: if HasChanged: print >> output, ' file has changed' else: print >> output, ' file has not changed'
def op_plt_hslice(conf,plconf,date,FA,nest=0,**kargs): closefig = kargs.get('closefig',True) clearfig = kargs.get('clearfig',True) save = kargs.get('save',True) Varname = kargs.get('vname',False) Depth = kargs.get('depth',False) date=dateu.parse_date(date) Err=[] Out=[] pltpath = opt.nameof('out','plots',cf=conf) Figure,err = opt.get_plconf(plconf,'FIGURE') Hslices,err = opt.get_plconf(plconf,'HSLICES') Title,err=opt.get_plconf(plconf,'AXES','title') def iterv(v): try: len(v) except: v=[v] return v for i in range(len(Figure.values()[0])): # loop figures Varnames = Hslices['varnames'][i].split(',') Varnames=[s.strip() for s in Varnames] depths = Hslices['depths'][i] addcurr = Hslices['addcurr'][i] # clims = Hslices['clim'][i] depths = iterv(depths) addcurr = iterv(addcurr) # clims = iterv(clims) kargs={} kargs['ifig']=i kargs['type']=Hslices['input'][i] #kargs['time']=Inputs['time'][i] TIMES=Hslices['time'][i] kargs['dcurr']=Hslices['dcurr'][i] kargs['scurr']=Hslices['scurr'][i] kargs['lcurr']=Hslices['lcurr'][i] if Varname: varnames=[Varname] else: varnames=Varnames for var in varnames: # loop variables var=var.strip() nv=Varnames.index(var) kargs['cmap']=Hslices['cmap'][i].split(',')[nv].strip() kargs['norm']=Hslices['norm'][i].split(',')[nv].strip() kargs['var']=var vdepths=depths[nv] try: iter(vdepths) except: vdepths=[vdepths] if Depth: vdepths=[Depth] nz=-1 for z in vdepths: # loop depths nz+=1 if z in ('s','surf','surface') or z>=0: kargs['ind'] = z kargs['slice'] = 'k' else: kargs['ind'] = z kargs['slice'] = 'z' cl=opt.get_clims(date,var,z,plconf)[i] kargs['clim']=cl for addc in addcurr: # add/no currents kargs['currents'] = addc # loop over time: if TIMES=='all': if FA=='a': times=[-1] else: times=range(int(opt.get_conf(conf,'PRED','npred')[0])) else: times=[TIMES] for it in times: kargs['time']=it e,fig,info=plt_hslice(conf,plconf,date,FA,nest,**kargs) Err+=[e] if not e: if var: svar=var else: svar='' if addc: scurr='curr' else: scurr='' if info['hasz']: sslice=kargs['slice']+'_'+str(kargs['ind']) else: sslice='' if date.hour>0: sdate=date.strftime('%Y%m%d_%H') else: sdate=date.strftime('%Y%m%d') savename='%s_%s_n%d_%s_%d_%s_%s_%s_%s' % (sdate,FA,nest,kargs['type'],kargs['time'],svar,scurr,sslice,Figure['tag'][i]) if Title[i]: simpleTitle=1 rdate=date.strftime('%d-%m-%Y') if sslice: sslice=sslice[2:] title='%s#%s#n%d#%s#%d#%s#%s#%s' % (rdate,FA,nest,kargs['type'],kargs['time'],svar,scurr,sslice) if simpleTitle: # simpler version of title: if FA=='f': # forecast date: rdate=dateu.next_date(date,kargs['time']) rdate=date.strftime('%d-%m-%Y') title = '%s#%s#%s#%s' % (rdate,svar,scurr,sslice) if FA=='f': title=title+' (forec)' while 1: if title.find('##')>-1: title=title.replace('##','#') else: break title=title.replace('#',' ') pl.title(title) while 1: if savename.find('__')>-1: savename=savename.replace('__','_') else: break savename=savename.strip('_') if save: Y,M,D=date.year,date.month,date.day, Ydest = os.path.join(pltpath,'%s' % Y ) if not os.path.isdir(Ydest): os.mkdir(Ydest) MDdest = os.path.join(Ydest,'%02d_%02d' % (M,D) ) if not os.path.isdir(MDdest): os.mkdir(MDdest) savename=os.path.join(MDdest,savename+'.'+Figure['extension'][i]) Out+=[savename] pl.savefig(savename,dpi=pl.gcf().dpi) #pl.savefig(savename,dpi=300) if clearfig: fig.clear() if closefig: pl.close(fig) return Err,Out