def get_datalist_radar(inargs, date): """ Get data time series for radar observation. Parameters ---------- inargs : : argparse object Argparse object with all input arguments date : str Date in format yyyymmddhh. If 'all', radar data for all days are returned radar_mask : 2D or 3D numpy array Radar mask to create masked arrays. Returns ------- datalist : list List of 2D masked arrays """ # Get file name radarpref = (get_config(inargs, 'paths', 'radar_data') + get_config(inargs, 'paths', 'radar_prefx')) radarsufx = get_config(inargs, 'paths', 'radar_sufix') dtradar = timedelta(minutes=10) if date is 'all': date_start = (yyyymmddhh_strtotime(inargs.date_start) + timedelta(hours=inargs.time_start) - dtradar) date_end = (yyyymmddhh_strtotime(inargs.date_end) + timedelta(hours=inargs.time_end) - dtradar) else: dateobj = yyyymmddhh_strtotime(date) date_start = dateobj + timedelta(hours=inargs.time_start) - dtradar date_end = dateobj + timedelta(hours=inargs.time_end) - dtradar datalist = getfobj_ncdf_timeseries(radarpref, date_start, date_end, timedelta(hours=inargs.time_inc), reftime=date_start, ncdffn_sufx=radarsufx, fieldn='pr', abs_datestr='yymmddhhmm', dwdradar=True, return_arrays=True) # Crop data l11, l12, l21, l22, l11_rad, l12_rad, l21_rad, l22_rad = \ get_domain_limits(inargs) for i, data in enumerate(datalist): datalist[i] = data[l11_rad:l12_rad, l21_rad:l22_rad] return datalist
#meanQtot = rootgrp.createVariable('meanQtot', 'f8', ('time','n','x','y')) if args.ana == 'vert': levs = rootgrp.variables['levs'] height = rootgrp.variables['height'] Mtot = rootgrp.variables['Mtot'] Msouth = rootgrp.variables['Msouth'] Mnorth = rootgrp.variables['Mnorth'] # End allocation ################################################################################ # Preliminaries before time loop if args.ana == 'prec': # Load radar data for all times dateobj = yyyymmddhh_strtotime(args.date) dtradar = timedelta(minutes=10) radarts = getfobj_ncdf_timeseries(radarpref, dateobj + tstart - dtradar, dateobj + tend - dtradar, tinc, reftime=dateobj, ncdffn_sufx=radarsufx, fieldn='pr', abs_datestr='yymmddhhmm', dwdradar=True) # Get mask radarmask = get_totmask(radarts) # Crop data radarmask = radarmask[lx1 + 62:lx2 - 42, ly1 + 22:ly2 - 42]
def plot_prec_stamps(inargs): """ Plots precipitation stamps of obs, det and ensemble every hour for each date and time specified Parameters ---------- inargs : argparse object Argparse object with all input arguments """ # Loop over dates for idate, date in enumerate(make_datelist(inargs)): print('Date ' + date) # Loop over times for t in make_timelist(timedelta(hours=inargs.time_start), timedelta(hours=inargs.time_end), timedelta(hours=1)): print('Time ' + str(t)) # Load all CU objects fobjlist = [] titlelist = [] # 1st: Radar radarpref = (get_config(inargs, 'paths', 'radar_data') + get_config(inargs, 'paths', 'radar_prefx')) radarsufx = get_config(inargs, 'paths', 'radar_sufix') dtradar = timedelta(minutes=10) radartime = yymmddhhmm(yyyymmddhh_strtotime(date) + t - dtradar) radarfn = radarpref + radartime + radarsufx radar_fobj = getfobj_ncdf(radarfn, fieldn='pr', dwdradar=True) # Crop data l11, l12, l21, l22, l11_rad, l12_rad, l21_rad, l22_rad = \ get_domain_limits(inargs) l11_diff = l11_rad - l11 l12_diff = l12_rad - l12 l21_diff = l21_rad - l21 l22_diff = l22_rad - l22 radar_fobj.data = radar_fobj.data[l11_diff:l12_diff, l21_diff:l22_diff] radar_fobj.lats = radar_fobj.lats[l11_diff:l12_diff, l21_diff:l22_diff] radar_fobj.lons = radar_fobj.lons[l11_diff:l12_diff, l21_diff:l22_diff] fobjlist.append(radar_fobj) titlelist.append('Radar') # 2nd: det ncdffn_pref = (get_config(inargs, 'paths', 'raw_data') + date + '/deout_ceu_pspens/' + 'det' + '/OUTPUT/lfff') fobjlist.append( getfobj_ncdf(ncdffn_pref + ddhhmmss(t) + '.nc_30m_surf', 'PREC_ACCUM')) titlelist.append('Det') # 3rd: ens ncdffn = 'lfff' + ddhhmmss(t) + '.nc_30m_surf' date_dir = (get_config(inargs, 'paths', 'raw_data') + date + '/deout_ceu_pspens/') fobjlist.extend( getfobj_ncdf_ens(date_dir, 'sub', inargs.nens, ncdffn, dir_suffix='/OUTPUT/', fieldn='PREC_ACCUM', nfill=1)) titlelist.extend( ['Member ' + str(i + 1) for i in range(inargs.nens)]) # Now plot n_panels = len(fobjlist) n_cols = 4 n_rows = int(np.ceil(float(n_panels) / n_cols)) pw = get_config(inargs, 'plotting', 'page_width') fig, axmat = plt.subplots(n_rows, n_cols, figsize=(pw, 3.0 * n_rows)) axflat = np.ravel(axmat) for i in range(len(fobjlist)): plt.sca(axflat[i]) cf = plot_stamp(inargs, fobjlist[i], cmPrec, levelsPrec, axflat[i], 'PREC_ACCUM') axflat[i].set_title(titlelist[i]) cb = fig.colorbar(cf, cax=fig.add_axes([0.4, 0.15, 0.2, 0.02]), orientation='horizontal') cb.set_label('Accumulation [mm/h]') titlestr = ((yyyymmddhh_strtotime(date) + t).strftime('%d %b - %H UTC')) fig.suptitle(titlestr) plt.subplots_adjust(wspace=0.02, left=0.02, right=0.98) # Save figure and log save_fig_and_log(fig, None, inargs, 'prec_stamps', datestr=((yyyymmddhh_strtotime(date) + t).strftime('%Y%m%d_%H')))
def plot_individual(inargs): """ Parameters ---------- inargs Returns ------- """ # Get data date_dir = (get_config(inargs, 'paths', 'raw_data') + inargs.date_start + '/deout_ceu_pspens/') t = timedelta(hours=inargs.time_start) if inargs.ind_var == 'PREC_ACCUM': ncdffn = 'lfff' + ddhhmmss(t) + '.nc_30m_surf' fobj = getfobj_ncdf(date_dir + str(inargs.ind_ens) + '/OUTPUT/' + ncdffn, fieldn='PREC_ACCUM') cmap = None colors = cmPrec levels = levelsPrec elif inargs.ind_var == 'radar': radarpref = (get_config(inargs, 'paths', 'radar_data') + get_config(inargs, 'paths', 'radar_prefx')) radarsufx = get_config(inargs, 'paths', 'radar_sufix') dtradar = timedelta(minutes=10) radartime = yymmddhhmm( yyyymmddhh_strtotime(inargs.date_start) + t - dtradar) radarfn = radarpref + radartime + radarsufx radar_fobj = getfobj_ncdf(radarfn, fieldn='pr', dwdradar=True) # Crop data l11, l12, l21, l22, l11_rad, l12_rad, l21_rad, l22_rad = \ get_domain_limits(inargs) l11_diff = l11_rad - l11 l12_diff = l12_rad - l12 l21_diff = l21_rad - l21 l22_diff = l22_rad - l22 radar_fobj.data = radar_fobj.data[l11_diff:l12_diff, l21_diff:l22_diff] radar_fobj.lats = radar_fobj.lats[l11_diff:l12_diff, l21_diff:l22_diff] radar_fobj.lons = radar_fobj.lons[l11_diff:l12_diff, l21_diff:l22_diff] fobj = radar_fobj elif inargs.ind_var in ['obj_m', 'obj_prec']: if inargs.ind_var == 'obj_m': lvl = 30 ncdffn = 'lfff' + ddhhmmss(t) + '.nc_30m' fobj = getfobj_ncdf(date_dir + str(inargs.ind_ens) + '/OUTPUT/' + ncdffn, fieldn='W', levs=lvl) opt_field = (getfield_ncdf( date_dir + str(inargs.ind_ens) + '/OUTPUT/' + ncdffn, fieldn='QC', levs=lvl) + getfield_ncdf( date_dir + str(inargs.ind_ens) + '/OUTPUT/' + ncdffn, fieldn='QS', levs=lvl) + getfield_ncdf( date_dir + str(inargs.ind_ens) + '/OUTPUT/' + ncdffn, fieldn='QI', levs=lvl)) else: ncdffn = 'lfff' + ddhhmmss(t) + '.nc_30m_surf' fobj = getfobj_ncdf(date_dir + str(inargs.ind_ens) + '/OUTPUT/' + ncdffn, fieldn='PREC_ACCUM') opt_field = None labels, size_list, sum_list = identify_clouds(fobj.data, 1., opt_field=opt_field, water=True, neighborhood=3, opt_thresh=0) fobj.data = labels cmap = plt.cm.prism colors = None levels = None else: raise Exception('Wrong variable!') # Set up figure pw = get_config(inargs, 'plotting', 'page_width') width_fraction = 2. / 9. ratio = 1. fig, ax = plt.subplots(1, 1, figsize=(pw * width_fraction, pw * width_fraction * ratio)) cf = plot_stamp(inargs, fobj, cmPrec, levelsPrec, ax, 'PREC_ACCUM') if inargs.ind_colorbar: cb = fig.colorbar(cf, orientation='horizontal', shrink=0.6) cb.set_label('Accumulation [mm/h]') plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.95) save_fig_and_log(fig, None, inargs, 'prec_individual', tight=False)
from cosmo_utils.pyncdf import getfobj_ncdf_timeseries radarpref = '/project/meteo/w2w/A6/radolan/netcdf_cosmo_de/raa01-rw_10000-' radarsufx = '-dwd---bin.nc' from datetime import timedelta from cosmo_utils.helpers import yyyymmddhh_strtotime tstart = '2016052801' tend = '2016060900' dtradar = timedelta(minutes=10) radarts = getfobj_ncdf_timeseries(radarpref, yyyymmddhh_strtotime(tstart) - dtradar, yyyymmddhh_strtotime(tend) - dtradar, timedelta(minutes=60), reftime=yyyymmddhh_strtotime(tstart), ncdffn_sufx=radarsufx, fieldn='pr', abs_datestr='yymmddhhmm', dwdradar=True) from cosmo_utils.diag import get_totmask radarmask = get_totmask(radarts) sxo, syo = (357, 357) # Determine analysis domain lx1 = (sxo - 256 - 1) / 2 # ATTENTION first dimension is actually y lx2 = -(lx1 + 1) # Number of grid pts to exclude at border ly1 = (syo - 256 - 1) / 2 ly2 = -(ly1 + 1) # Crop data radarmask = radarmask[lx1 + 62:lx2 - 42, ly1 + 22:ly2 - 42]
def plot_prec_stamps(inargs): """ Plots precipitation stamps of obs, det and ensemble every hour for each date and time specified Parameters ---------- inargs : argparse object Argparse object with all input arguments """ # TODO: Update colors cmPrec = ((1, 1, 1), (0, 0.627, 1), (0.137, 0.235, 0.98), (0.392, 0, 0.627), (0.784, 0, 0.627)) # (0.1 , 0.1 , 0.784), levelsPrec = [0, 1, 3, 10, 30, 100.] # Loop over dates for idate, date in enumerate(make_datelist(inargs)): # Loop over times for t in make_timelist(timedelta(hours=inargs.time_start), timedelta(hours=inargs.time_end), timedelta(hours=1)): # Load all CU objects fobjlist = [] titlelist = [] # 1st: Radar fobjlist.append(get_and_crop_radar_fobj(inargs, date, t)) titlelist.append('Radar') # 2nd: det ncdffn_pref = (get_config(inargs, 'paths', 'raw_data') + date + '/deout_ceu_pspens/' + 'det' + '/OUTPUT/lfff') fobjlist.append( getfobj_ncdf(ncdffn_pref + ddhhmmss(t) + '.nc_30m_surf', 'PREC_ACCUM')) titlelist.append('Det') # 3rd: ens ncdffn = 'lfff' + ddhhmmss(t) + '.nc_30m_surf' date_dir = (get_config(inargs, 'paths', 'raw_data') + date + '/deout_ceu_pspens/') fobjlist.extend( getfobj_ncdf_ens(date_dir, 'sub', inargs.nens, ncdffn, dir_suffix='/OUTPUT/', fieldn='PREC_ACCUM', nfill=1)) titlelist.extend(['Mem ' + str(i + 1) for i in range(inargs.nens)]) # Now plot n_panels = len(fobjlist) n_cols = 4 n_rows = int(np.ceil(float(n_panels) / n_cols)) fig, axmat = plt.subplots(n_rows, n_cols, figsize=(10, 3.5 * n_rows)) axflat = np.ravel(axmat) for i in range(len(fobjlist)): plt.sca(axflat[i]) cf, tmp = ax_contourf(axflat[i], fobjlist[i], colors=cmPrec, pllevels=levelsPrec, ji0=(50 + inargs.zoom_lat1, 50 + inargs.zoom_lon1), ji1=(357 - 51 + inargs.zoom_lat2, 357 - 51 + inargs.zoom_lon2), sp_title=titlelist[i], Basemap_drawrivers=False, npars=0, nmers=0) cb = fig.colorbar(cf, cax=fig.add_axes([0.4, 0.1, 0.2, 0.02]), orientation='horizontal') cb.set_label('Accumulation [mm/h]') titlestr = (yyyymmddhh_strtotime(date).strftime( get_config(inargs, 'plotting', 'date_fmt')) + ' ' + str(t.seconds / 3600).zfill(2) + 'UTC') fig.suptitle(titlestr) plt.tight_layout(rect=[0, 0.1, 1, 0.93]) # Save figure and log save_fig_and_log(fig, None, inargs, 'prec_stamps', date=date, time=str(t.seconds / 3600).zfill(2))