def hydrometeor_classification(radar, gatefilter, kdp_name, zdr_name, band, refl_name='DBZ_CORR', rhohv_name='RHOHV_CORR', temperature_name='temperature', height_name='height'): """ Compute hydrometeo classification. Parameters: =========== radar: Py-ART radar structure. refl_name: str Reflectivity field name. zdr_name: str ZDR field name. kdp_name: str KDP field name. rhohv_name: str RHOHV field name. temperature_name: str Sounding temperature field name. height: str Gate height field name. Returns: ======== hydro_meta: dict Hydrometeor classification. """ refl = radar.fields[refl_name]['data'].copy().filled(np.NaN) zdr = radar.fields[zdr_name]['data'].copy().filled(np.NaN) try: kdp = radar.fields[kdp_name]['data'].copy().filled(np.NaN) except AttributeError: kdp = radar.fields[kdp_name]['data'].copy() rhohv = radar.fields[rhohv_name]['data'] try: radar_T = radar.fields[temperature_name]['data'] use_temperature = True except Exception: use_temperature = False if use_temperature: scores = csu_fhc.csu_fhc_summer(dz=refl, zdr=zdr, rho=rhohv, kdp=kdp, use_temp=True, band=band, T=radar_T) else: scores = csu_fhc.csu_fhc_summer(dz=refl, zdr=zdr, rho=rhohv, kdp=kdp, use_temp=False, band=band) hydro = np.argmax(scores, axis=0) + 1 hydro[gatefilter.gate_excluded] = 0 hydro_data = np.ma.masked_equal(hydro.astype(np.int16), 0) the_comments = "1: Drizzle; 2: Rain; 3: Ice Crystals; 4: Aggregates; " +\ "5: Wet Snow; 6: Vertical Ice; 7: LD Graupel; 8: HD Graupel; 9: Hail; 10: Big Drops" hydro_meta = {'data': hydro_data, 'units': ' ', 'long_name': 'Hydrometeor classification', '_FillValue': np.int16(0), 'standard_name': 'Hydrometeor_ID', 'comments': the_comments} return hydro_meta
def get_hid(self): """Calculate hydrometeror ID, add to radar object.""" _fhv = _FhcVars(self) if not self.winter_flag: bt = time.time() # Cut down on processing missing/bad data good = _fhv.dz != self.bad if self.name_ld is not None: _fhv.ld = _fhv.ld[good] if _fhv.tt is not None: _fhv.tt = _fhv.tt[good] # Only run FHC if the scope is not completely blank if np.size(_fhv.dz[good]) > 0: scores = csu_fhc.csu_fhc_summer( dz=_fhv.dz[good], zdr=_fhv.dr[good], rho=_fhv.rh[good], kdp=_fhv.kd[good], ldr=_fhv.ld, use_temp=self.T_flag, band=self.band, method=self.fhc_method, T=_fhv.tt, verbose=self.verbose, temp_factor=self.T_factor, weights=self.fhc_weights) # Create and populate the FHC field fh = np.zeros_like(_fhv.dz) + self.bad fh[good] = np.argmax(scores, axis=0) + 1 fh = np.reshape(fh, _fhv.shp) self.add_field_to_radar_object(fh, field_name=self.name_fhc) print(time.time()-bt, 'seconds to do FHC') else: print('No good data for FHC, not performed') else: print('Winter HID not enabled yet, sorry!')
def hydrometeor_classification(radar, refl_name='DBZ_CORR', zdr_name='ZDR_CORR', kdp_name='KDP', rhohv_name='RHOHV_CORR', temperature_name='sounding_temperature', height_name='height'): """ Compute hydrometeo classification. Parameters: =========== radar: Py-ART radar structure. refl_name: str Reflectivity field name. zdr_name: str ZDR field name. kdp_name: str KDP field name. rhohv_name: str RHOHV field name. temperature_name: str Sounding temperature field name. height: str Gate height field name. Returns: ======== hydro_meta: dict Hydrometeor classification. """ refl = radar.fields[refl_name]['data'] zdr = radar.fields[zdr_name]['data'] kdp = radar.fields[kdp_name]['data'] rhohv = radar.fields[rhohv_name]['data'] radar_T = radar.fields[temperature_name]['data'] radar_z = radar.fields[height_name]['data'] scores = csu_fhc.csu_fhc_summer(dz=refl, zdr=zdr, rho=rhohv, kdp=kdp, use_temp=True, band='C', T=radar_T) hydro = np.argmax(scores, axis=0) + 1 fill_value = -32768 hydro_data = np.ma.asanyarray(hydro) hydro_data.mask = hydro_data == fill_value the_comments = "1: Drizzle; 2: Rain; 3: Ice Crystals; 4: Aggregates; " +\ "5: Wet Snow; 6: Vertical Ice; 7: LD Graupel; 8: HD Graupel; 9: Hail; 10: Big Drops" hydro_meta = {'data': hydro_data, 'units': ' ', 'long_name': 'Hydrometeor classification', 'standard_name': 'Hydrometeor_ID', 'comments': the_comments } return hydro_meta
def calculate_hidro_rain(radar, sounding, rain_field_dict=dict(field_name='rain', units='mm h-1', long_name='HIDRO Rainfall Rate', standard_name='rain_hca'), method_field_dict=dict( field_name='method', units='', long_name='HIDRO Rainfall Method', standard_name='rain_estimate_method')): ''' Calculate rainfall using the hidro_rain, method Parameters ---------- radar: pyart radar object from nexrad volume scan sounding: SkewT sounding for the appropriate time and location Returns ------- radar: with new rain field added according to dict ''' from csu_radartools import csu_fhc, csu_blended_rain dz = extract_unmasked_data(radar, 'reflectivity') dr = extract_unmasked_data(radar, 'differential_reflectivity') dp = extract_unmasked_data(radar, 'differential_phase') rh = extract_unmasked_data(radar, 'cross_correlation_ratio') radar_T, radar_z = interpolate_sounding_to_radar(sounding, radar) if 'kdp' not in radar.fields.keys(): radar = get_kdp(radar) kd = extract_unmasked_data(radar, 'kdp') scores = csu_fhc.csu_fhc_summer(dz=dz, zdr=dr, rho=rh, kdp=kd, band='S', use_temp=True, T=radar_T) fh = np.argmax(scores, axis=0) + 1 rain, method = csu_blended_rain.csu_hidro_rain(dz=dz, zdr=dr, kdp=kd, fhc=fh) radar = add_field_to_radar_object(rain, radar, **rain_field_dict) radar = add_field_to_radar_object(method, radar, **method_field_dict) return radar
def get_hid(self): """Calculate hydrometeror ID, add to radar object.""" dz = self.radar.fields[self.name_dz]['data'] dr = self.radar.fields[self.name_dr]['data'] kd = self.radar.fields[self.name_kd]['data'] rh = self.radar.fields[self.name_rh]['data'] if self.name_ld is not None: ld = self.radar.fields[self.name_ld]['data'] else: ld = None if not self.winter_flag: scores = csu_fhc.csu_fhc_summer( dz=dz, zdr=dr, rho=rh, kdp=kd, ldr=ld, use_temp=self.T_flag, band=self.band, method=self.fhc_method, T=self.radar_T, verbose=self.verbose, temp_factor=self.T_factor, weights=self.fhc_weights) fh = np.argmax(scores, axis=0) + 1 self.add_field_to_radar_object(fh, field_name=self.name_fhc) else: print('Winter HID not enabled yet, sorry!')
def calculate_radar_hid(radar, sounding_names, radar_band="S"): """ Use radar and sounding data to calculate: - Temperature and height profiles - Hydrometeor classification with CSU_RadarTools - Liquid and ice water masses, ice fraction Parameters ---------- radar: Py-ART radar data sounding_names: list of sounding data filenames radar_band: radar band Returns ------- file: radar data with HID and water masses """ # Getting date for sounding - optional # radar_date = pd.to_datetime(radar.time['units'][14:]) # Interpolating with sounding soundings = sounding(sounding_names) # - optional: sounding_names.loc[str(radar_date.date())].item() radar_T, radar_z = interpolate_sounding_to_radar(soundings, radar) # Extracting necessary variables z_corrected = radar.fields["corrected_reflectivity"]["data"] zdr = radar.fields["differential_reflectivity"]["data"] kdp = radar.fields["specific_differential_phase"]["data"] rho_hv = radar.fields["cross_correlation_ratio"]["data"] # Classifying scores = csu_fhc.csu_fhc_summer( weights={ "DZ": 1, "DR": 1, "KD": 1, "RH": 1, "LD": 1, "T": 1 }, dz=z_corrected, zdr=zdr, kdp=kdp, rho=rho_hv, use_temp=True, T=radar_T, band=radar_band, verbose=True, method="hybrid", ) fh = np.argmax(scores, axis=0) + 1 # - Adding to radar file radar = add_field_to_radar_object(fh, radar, standard_name="Hydrometeor ID") # - Calculating liquid and ice mass mw, mi = csu_liquid_ice_mass.calc_liquid_ice_mass(z_corrected, zdr, radar_z / 1000.0, T=radar_T) # - Adding to radar file file = add_field_to_radar_object( mw, radar, field_name="MW", units=r"$g\ m^{-3}$", long_name="Liquid Water Mass", standard_name="Liquid Water Mass", ) file = add_field_to_radar_object( mi, file, field_name="MI", units=r"$g\ m^{-3}$", long_name="Ice Water Mass", standard_name="Ice Water Mass", ) return file
sounding = SkewT.Sounding(filepath + sndfile) # Extract relevant radar fields dz = radar.fields['ZC']['data'] dr = radar.fields['ZD']['data'] kd = radar.fields['KD']['data'] rh = radar.fields['RH']['data'] # interpolate the sounding to radar grid radar_T, radar_z = interpolate_sounding_to_radar(sounding, radar) # run the classification scores = csu_fhc.csu_fhc_summer(dz=dz, zdr=dr, rho=rh, kdp=kd, use_temp=True, band='C', T=radar_T) fh = np.argmax(scores, axis=0) + 1 # add classification field to radar object radar = add_field_to_radar_object(fh, radar) # plot the result hid_colors = [ 'White', 'LightBlue', 'MediumBlue', 'DarkOrange', 'LightPink', 'Cyan', 'DarkGray', 'Lime', 'Yellow', 'Red', 'Fuchsia' ] cmaphid = colors.ListedColormap(hid_colors) cmapmeth = colors.ListedColormap(hid_colors[0:6])
def hydrometeor_classification( radar, gatefilter, kdp_name, zdr_name, refl_name="DBZ_CORR", rhohv_name="RHOHV_CORR", temperature_name="temperature", height_name="height", ): """ Compute hydrometeo classification. Parameters: =========== radar: Py-ART radar structure. refl_name: str Reflectivity field name. zdr_name: str ZDR field name. kdp_name: str KDP field name. rhohv_name: str RHOHV field name. temperature_name: str Sounding temperature field name. height: str Gate height field name. Returns: ======== hydro_meta: dict Hydrometeor classification. """ refl = radar.fields[refl_name]["data"].copy().filled(np.NaN) zdr = radar.fields[zdr_name]["data"].copy().filled(np.NaN) try: kdp = radar.fields[kdp_name]["data"].copy().filled(np.NaN) except AttributeError: kdp = radar.fields[kdp_name]["data"].copy() rhohv = radar.fields[rhohv_name]["data"] try: radar_T = radar.fields[temperature_name]["data"] use_temperature = True except Exception: use_temperature = False if use_temperature: hydro = csu_fhc.csu_fhc_summer(dz=refl, zdr=zdr, rho=rhohv, kdp=kdp, use_temp=True, band="C", T=radar_T) else: hydro = csu_fhc.csu_fhc_summer(dz=refl, zdr=zdr, rho=rhohv, kdp=kdp, use_temp=False, band="C") hydro[gatefilter.gate_excluded] = 0 hydro_data = np.ma.masked_equal(hydro.astype(np.int16), 0) the_comments = ( "1: Drizzle; 2: Rain; 3: Ice Crystals; 4: Aggregates; " + "5: Wet Snow; 6: Vertical Ice; 7: LD Graupel; 8: HD Graupel; 9: Hail; 10: Big Drops" ) hydro_meta = { "data": hydro_data, "units": " ", "long_name": "Hydrometeor classification", "_FillValue": np.int16(0), "standard_name": "Hydrometeor_ID", "comments": the_comments, } return hydro_meta
# hid_identifier = 'zdr' ##Adjustment of ZDR, RHO # set_weights = {'DZ': 1.5, 'DR': 1.2, 'KD': 0.8, 'RH': 0.6, 'LD': 0.0, 'T': 0.4} # hid_identifier = 'zdrrho' ##2nd Adjustment of ZDR, RHO # set_weights = {'DZ': 1.5, 'DR': 1.2, 'KD': 0.8, 'RH': 0.4, 'LD': 0.0, 'T': 0.4} # hid_identifier = 'zdrrho2' ##Adjustment of ZDR, RHO, KDP # set_weights = {'DZ': 1.5, 'DR': 1.2, 'KD': 1.0, 'RH': 0.4, 'LD': 0.0, 'T': 0.4} # hid_identifier = 'zrk' #determine HID scores scores = csu_fhc.csu_fhc_summer(dz=dz, zdr=dr, rho=rh, kdp=kd, use_temp=True, band='S', T=grid_T, weights = set_weights) fh = np.argmax(scores, axis=0) + 1 # sys.exit() #add HID results to grid grid = add_field_to_grid_object(fh, grid, field_name = 'FH', units = 'unitless', long_name = 'Hydrometeor ID', standard_name = 'Hydrometeor ID') #============================================================================== #Mass calculations #============================================================================== #determine mass of water and ice mw, mi = csu_liquid_ice_mass.calc_liquid_ice_mass(dz, dr, grid_z/1000.0, T=grid_T, method=None, fit_a=None, fit_b=None) #add mass calculation results to grid grid = add_field_to_grid_object(mw, grid, field_name = 'Mw', units = 'g/m^3', long_name = 'Liquid Water Mass', standard_name = 'Liquid Water Mass') grid = add_field_to_grid_object(mi, grid, field_name = 'Mi', units = 'g/m^3', long_name = 'Ice Water Mass', standard_name = 'Ice Water Mass') #==============================================================================