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
Beispiel #2
0
 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!')
Beispiel #3
0
 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
Beispiel #5
0
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
Beispiel #6
0
 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])
Beispiel #9
0
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
Beispiel #10
0
#    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')
    #==============================================================================