"""Retrieval of QVPs from a radar object"""importnumpyasnpfrom..core.transformsimportantenna_to_cartesian
[docs]defquasi_vertical_profile(radar,desired_angle=None,fields=None,gatefilter=None):""" Quasi Vertical Profile. Creates a QVP object containing fields from a radar object that can be used to plot and produce the quasi vertical profile Parameters ---------- radar : Radar Radar object used. field : string Radar field to use for QVP calculation. desired_angle : float Radar tilt angle to use for indexing radar field data. None will result in wanted_angle = 20.0 Other Parameters ---------------- gatefilter : GateFilter A GateFilter indicating radar gates that should be excluded from the import qvp calculation Returns ------- qvp : Dictonary A quasai vertical profile object containing fields from a radar object References ---------- Troemel, S., M. Kumjian, A. Ryzhkov, and C. Simmer, 2013: Backscatter differential phase - estimation and variability. J Appl. Meteor. Clim.. 52, 2529 - 2548. Troemel, S., A. Ryzhkov, P. Zhang, and C. Simmer, 2014: Investigations of backscatter differential phase in the melting layer. J. Appl. Meteorol. Clim. 54, 2344 - 2359. Ryzhkov, A., P. Zhang, H. Reeves, M. Kumjian, T. Tschallener, S. Tromel, C. Simmer, 2015: Quasi-vertical profiles - a new way to look at polarimetric radar data. Submitted to J. Atmos. Oceanic Technol. """# Creating an empty dictonaryqvp={}# Setting the desired radar angle and getting index value for desired radar angleifdesired_angleisNone:desired_angle=20.0index=abs(radar.fixed_angle['data']-desired_angle).argmin()radar_slice=radar.get_slice(index)# Printing radar tilt angles and radar elevationprint(radar.fixed_angle['data'])print(radar.elevation['data'][-1])# Setting field parameters# If fields is None then all radar fields pulled else defined field is usediffieldsisNone:fields=radar.fieldsforfieldinfields:# Filtering data based on defined gatefilter# If none is defined goes to else statementifgatefilterisnotNone:get_fields=radar.get_field(index,field)mask_fields=np.ma.masked_where(gatefilter.gate_excluded[radar_slice],get_fields)radar_fields=np.ma.mean(mask_fields,axis=0)else:radar_fields=radar.get_field(index,field).mean(axis=0)qvp.update({field:radar_fields})else:# Filtereing data based on defined gatefilter# If none is defined goes to else statementifgatefilterisnotNone:get_field=radar.get_field(index,fields)mask_field=np.ma.masked_where(gatefilter.gate_excluded[radar_slice],get_field)radar_field=np.ma.mean(mask_field,axis=0)else:radar_field=radar.get_field(index,fields).mean(axis=0)qvp.update({fields:radar_field})# Adding range, time, and height fieldsqvp.update({'range':radar.range['data'],'time':radar.time})_,_,z=antenna_to_cartesian(qvp['range']/1000.0,0.0,radar.fixed_angle['data'][index])qvp.update({'height':z})returnqvp