Non-meteorological echoes using fuzzy echo classification

Hello everyone,

I am happy to start using some useful tools available in libraries such as wradlib.

I am currently performing quality control on X-band radar data. For the moment, I have created cumulative beam blockage (CBB) maps and am trying to define a workflow for clutter removal and posterior attenuation correction.

I would like to use the wrl.classify.classify_echo_fuzzy tool to perform echo classification, but I have some specific questions:

  • I read in other posts that the static clutter map can be obtained through the Gabella filter, so I am doing it like that. Although I haven’t been able to find the paper that is constantly cited in the web. Is there any criteria to set the parameters?

  • Assuming that I have a proper static clutter map in my dataset (sweep), when I try to apply the fuzzy logic for the echo classification, I am getting some errors. I have tried doing this:

    # Identify non-meteorological echoes using fuzzy echo classification
    
    moments = dict(zdr = 'ZDR', rho = 'RHOHV', phi = 'PHIDP', dop = 'VEL', map = 'CMAP')
    weights = {'zdr': 0.4, 'rho': 0.4, 'phi': 0.1, 'dop': 0.1, 'map': 0.5}
    prob, nanmask = swp.wrl.classify.classify_echo_fuzzy(moments, weights = weights)
    

    But then I get this error:

    ValueError: Argument dat must be a dictionary with mandatory keywords (‘zdr’, ‘rho’, ‘phi’, ‘dop’, ‘map’).

    The documentation (I am using version 2.4.0) calls the differential phase ‘phidp’ in the docstring. So I have tried using:

    # Identify non-meteorological echoes using fuzzy echo classification
    
    moments = dict(zdr = 'ZDR', rho = 'RHOHV', phidp = 'PHIDP', dop = 'VEL', map = 'CMAP')
    weights = {'zdr': 0.4, 'rho': 0.4, 'phidp': 0.1, 'dop': 0.1, 'map': 0.5}
    prob, nanmask = swp.wrl.classify.classify_echo_fuzzy(moments, weights = weights)
    

    But then again, I get an error related to the number of arguments:

    ValueError: input_core_dims must be None or a tuple with the length same to the number of arguments. Given 5 input_core_dims: [[‘azimuth’, ‘range’], [‘azimuth’, ‘range’], [‘azimuth’, ‘range’], [‘azimuth’, ‘range’], [‘azimuth’, ‘range’]], but number of args is 4.

    So I would like to know what I am doing wrong. I think that I am missing something related to the variables I am giving to the echo classification. I have checked the dimensions and coordinates of the variables, especially for the clutter map, but it seems to be coherent with the other variables (I did it using swp = swp.assign({‘CMAP’: CMAP})).

  • Finally, as I am new to the use of radars, I would like to confirm whether the workflow I intend to follow is optimal. I am taking the raw data. I want to filter the variables by beam blockage, clutter (using the meteo echo classification), and then, with the filtered data by clutter and beam blockage, I intend to check for bright band, and finally for attenuation correction. Do you think it is robust enough for future QPE? Do you have any hints on which tools to use?

Thank you in advance for your responses, and I hope I described the problem in a proper and not so extensive way.

Nicolás

Hello @NicolasChaves53,

thanks for the extensive explanation of your envisioned workflow.

First, regarding your error, this is an issue with wradlib, which has been fixed in latest main. See Inconsistent arguments in classify_echo_fuzzy xarray accessor.

You can workaround this by adding ref='DBZH' like this:

# Identify non-meteorological echoes using fuzzy echo classification
moments = dict(zdr = 'ZDR', rho = 'RHOHV', ref='DBZH', phidp = 'PHIDP', dop = 'VEL', map = 'CMAP')
weights = {'zdr': 0.4, 'rho': 0.4, 'phidp': 0.1, 'dop': 0.1, 'map': 0.5}
prob, nanmask = swp.wrl.classify.classify_echo_fuzzy(moments, weights = weights)

DBZH won’t be used in the calculation. At least this should get your processing running. Let me know, if this works for you.

For the overall workflow, you have more options to derive a static clutter map. Beside the Gabella approach we have Heuristic clutter detection based on distribution properties (“histo cut”) — wradlib which uses long timeseries of radar data.

I recommend reading

These two papers cover fuzzy classification in great detail and might help in assessing your overall strategy.

Regarding QPE workflow I hope you’ll get more insights from others. I encourage everyone to share their thoughts on this topic.

Best,
Kai

Hello @kmuehlbauer

Thank you very much for the quick reply.

I wasn’t aware of this issue, and after adding ref='DBZH' as you suggested, the echo classification is now working.

Also, thank you for the references and for pointing me to the heuristic clutter detection approach, I will look into these to set up my workflow properly.

Best regards,
Nicolas