"""Clutter detection module."""
# WRaINfo, Is a software to process FURUNO weather radar data.
#
# Copyright (c) 2022, FernLab (GFZ Potsdam, fernlab@gfz-potsdam.de)
#
# This software was developed within the context of the RaINfo ("Potential use of
# high resolution weather data in agriculture") project of FernLab funded by
# the Impulse and Networking Fund of the Helmholtz Association.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
#
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# imports
# -------
import logging
import xarray as xr
import wradlib as wrl
import numpy as np
from wrainfo.reader import read_single_file
# fuzzy echo classification based on wRadlib
# -------------------------------------------
[docs]def fuzzy_echo_classification(ds, cmap, dims=["azimuth", "range"]):
"""Fuzzy echo classification and clutter identification based on polarimetric variables.
Parameters
----------
ds : xarray.Dataset
cmap : xarray.DataArray
processed clutter map
dims : list
dimension of the dataset
Returns
-------
: xarray.Dataset
xarray.Dataset with a clutter map.
"""
trpz_default = {"zdr": [0.7, 1.0, 9999, 9999],
"rho": [0.1, 0.15, 9999, 9999],
"phi": [15, 20, 10000, 10000],
"dop": [-0.2, -0.1, 0.1, 0.2],
"map": [1, 1, 9999, 9999],
"rho2": [-9999, -9999, 0.95, 0.98],
"dr": [-20, -12, 9999, 9999],
"cpa": [0.6, 0.9, 9999, 9999], }
weights = {"zdr": 0.4,
"rho": 0.4,
"rho2": 0.4,
"phi": 0.1,
"dop": 0.1,
"map": 0.5}
dat = dict(rho=ds.RHOHV.values,
phi=ds.PHIDP.values,
ref=ds.DBZH.values,
rho2=ds.RHOHV.values,
dop=ds.VRAD.values,
zdr=ds.ZDR.values,
map=cmap.values)
clmap, nanmask = wrl.clutter.classify_echo_fuzzy(dat,
weights=weights,
trpz=trpz_default,
thresh=0.5)
ds = ds.assign(dict(FUZZ=(dims, clmap)))
return ds
# remove clutter
# --------------
[docs]def dbzh_no_clutter(ds, dims=["azimuth", "range"]):
"""Set DBZH values, where clutter were identified, to NaN-values.
Parameters
----------
ds : xarray.Dataset
dims : list
dimensions of the dataset
Returns
-------
: xarray.Dataset
xarray.Dataset with removed clutter.
"""
dbzh_no_clutter = ds.DBZH.where(ds.FUZZ == False) # noqa E712
dbzh_no_clutter_attrs = {"standard_name": "radar_equivalent_reflectivity_factor_h",
"long_name": "Equivalent reflectivity factor H",
"unit": "dBZ", }
ds["DBZH_no_clutter"] = xr.DataArray(dbzh_no_clutter,
dims=dims,
attrs=dbzh_no_clutter_attrs)
return ds
[docs]def create_clutter_map_sequential(files, threshold=0, grp="dataset1", status=False, logger=logging.getLogger()):
"""Create a clutter map sequential in order to not overload the working memory.
Parameters
----------
files : list
threshold : integer
threshold of the reflectivity
status : bool
percent of progress
Returns
-------
: xarray.Dataset
xarray.Dataset with clutter values.
"""
file_count = 0
elapsed = 0
logger.info("Processing " + str(len(files)) + " files sequentially.")
file = files[0]
sum_dbzh_values = None
for file in files:
try:
# read furuno files
data = read_single_file(file=file, grp=grp)
except Exception:
# except errors if a file could not read
logger.warning("Could not load file:' " + file + "'.")
continue
# create a data array of reflectivity values
if sum_dbzh_values is None:
sum_dbzh_values = data.DBZH[0, :, :].values
else:
values = data.DBZH[0, :, :].values
# extract only correct values without NaN values
good = ~np.isnan(values)
sum_dbzh_values[good] += data.DBZH[0, :, :].values[good]
file_count += 1
new = round(20 * file_count / len(files), 0)
if status:
if new > elapsed:
elapsed = new
print(str(elapsed * 5) + "% done")
logger.info("Creating boolean clutter map.")
sum_dbzh_bool = sum_dbzh_values > threshold
# set attributes for the new data array
sum_dbzh_values_attrs = {"standard_name": "radar_equivalent_reflectivity_factor_h",
"long_name": "Equivalent reflectivity factor H",
"unit": "dBZ", }
# create dataset
logger.info("Creating arrays.")
data["DBZH_sum_values"] = xr.DataArray(sum_dbzh_values,
dims=["azimuth", "range"],
attrs=sum_dbzh_values_attrs)
data["DBZH_sum_bool"] = xr.DataArray(sum_dbzh_bool,
dims=["azimuth", "range"],
attrs=sum_dbzh_values_attrs)
# delete all other moments in the dataset except for clutter map
variables = ['DBZH_sum_bool', 'DBZH_sum_values']
cmap = data[variables]
return cmap