cloudnetpy 1.96.8__tar.gz → 1.97.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cloudnetpy-1.96.8/cloudnetpy.egg-info → cloudnetpy-1.97.1}/PKG-INFO +1 -1
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/radar.py +1 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/plotting/plot_meta.py +1 -1
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/plotting/plotting.py +13 -13
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/ier.py +1 -1
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/iwc.py +31 -40
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/lwc.py +15 -8
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/version.py +2 -2
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1/cloudnetpy.egg-info}/PKG-INFO +1 -1
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/LICENSE +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/MANIFEST.in +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/README.md +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/arm.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/atmos_utils.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuation.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/categorize.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/classify.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/containers.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/disdrometer.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/droplet.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/falling.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/freezing.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/insects.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/lidar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/melting.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/model.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/mwr.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/cli.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/cloudnetarray.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/concat_lib.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/constants.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/datasource.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/disdronator/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/disdronator/lpm.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/disdronator/parsivel.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/disdronator/process.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/disdronator/rd80.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/disdronator/utils.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/exceptions.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/arm_ceilo.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/arm_ld.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/arm_utils.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/basta.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/bowtie.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/ceilo.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/ceilometer.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/cl61d.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/copernicus.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/da10.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/dealias.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/disdrometer.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/fd12p.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/galileo.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/hatpro.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/instruments.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/kazr.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/lufft.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/mira.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/mmcr.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/mrr.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/mwr3c.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/mwrlos.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/nc_lidar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/nc_radar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/pollyxt.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/radiometrics.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/rain_e_h3.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/rpg.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/rpg_reader.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/toa5.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/vaisala.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/weather_radar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/instruments/weather_station.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/metadata.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/file_handler.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/metadata.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/utils.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/output.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/plotting/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/__init__.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/classification.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/cod.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/der.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/drizzle.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/drizzle_error.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/drizzle_tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/epsilon_lidar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/epsilon_radar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/iwc_weather_radar.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/mie_lu_tables.nc +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/mwr_tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/products/product_tools.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/py.typed +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/utils.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy.egg-info/SOURCES.txt +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy.egg-info/dependency_links.txt +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy.egg-info/entry_points.txt +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy.egg-info/requires.txt +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy.egg-info/top_level.txt +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/docs/source/conf.py +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/pyproject.toml +0 -0
- {cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/setup.cfg +0 -0
|
@@ -464,6 +464,7 @@ class Plot:
|
|
|
464
464
|
"air_pressure": (multiply, 0.01, "hPa"),
|
|
465
465
|
"relative_humidity": (multiply, 100, "%"),
|
|
466
466
|
"rh": (multiply, 100, "%"),
|
|
467
|
+
"lwc_error": (multiply, 100, "%"),
|
|
467
468
|
"rainfall_amount": (multiply, con.M_TO_MM, "mm"),
|
|
468
469
|
"snowfall_amount": (multiply, con.M_TO_MM, "mm"),
|
|
469
470
|
"precipitation_amount": (multiply, con.M_TO_MM, "mm"),
|
|
@@ -725,29 +726,28 @@ class Plot2D(Plot):
|
|
|
725
726
|
if figure_data.is_mwrpy_product():
|
|
726
727
|
self._fill_flagged_data(figure_data)
|
|
727
728
|
|
|
728
|
-
if
|
|
729
|
+
if self.sub_plot.variable.name == "signal_source_status":
|
|
729
730
|
self._indicate_rainy_profiles(figure_data)
|
|
730
731
|
|
|
731
732
|
def _indicate_rainy_profiles(self, figure_data: FigureData) -> None:
|
|
732
733
|
if "rain_detected" not in figure_data.file.variables:
|
|
733
734
|
return
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
if is_rain.mask.all():
|
|
735
|
+
is_rain = figure_data.file.variables["rain_detected"][:] == 1
|
|
736
|
+
if not is_rain.any():
|
|
737
737
|
return
|
|
738
|
-
self._ax.
|
|
738
|
+
self._ax.fill_between(
|
|
739
739
|
figure_data.time,
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
740
|
+
*self._get_y_limits(),
|
|
741
|
+
where=is_rain,
|
|
742
|
+
step="mid",
|
|
743
|
+
facecolor="#1f77b4",
|
|
744
|
+
alpha=0.18,
|
|
745
|
+
linewidth=0,
|
|
746
746
|
label="Rain",
|
|
747
|
+
zorder=_get_zorder("flags"),
|
|
747
748
|
)
|
|
748
749
|
self._ax.legend(
|
|
749
|
-
|
|
750
|
-
numpoints=1,
|
|
750
|
+
loc="upper right",
|
|
751
751
|
frameon=False,
|
|
752
752
|
)
|
|
753
753
|
|
|
@@ -20,7 +20,7 @@ def generate_ier(
|
|
|
20
20
|
) -> UUID:
|
|
21
21
|
"""Generates Cloudnet ice effective radius product.
|
|
22
22
|
|
|
23
|
-
This function calculates ice particle effective radius using the
|
|
23
|
+
This function calculates ice particle effective radius using the Griesche
|
|
24
24
|
et al. 2020 method which uses Hogan et al. 2006 to estimate ice water content
|
|
25
25
|
and alpha from Delanoë et al. 2007. In this method, effective radius
|
|
26
26
|
of ice particles is calculated from attenuated-corrected radar reflectivity
|
|
@@ -3,14 +3,20 @@
|
|
|
3
3
|
from os import PathLike
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
|
|
6
|
+
import numpy as np
|
|
6
7
|
import numpy.typing as npt
|
|
7
8
|
from numpy import ma
|
|
8
9
|
|
|
9
10
|
from cloudnetpy import output, utils
|
|
10
|
-
from cloudnetpy.constants import G_TO_KG
|
|
11
11
|
from cloudnetpy.metadata import MetaData
|
|
12
12
|
from cloudnetpy.products.product_tools import IceClassification, IceSource
|
|
13
13
|
|
|
14
|
+
# Rms error (dB) of the Z-T retrieval at warm (-20...-10 degC) and cold
|
|
15
|
+
# (< -40 degC) temperatures from Hogan et al. (2006).
|
|
16
|
+
RETRIEVAL_UNCERTAINTY = {"Ka": (1.5, 3.0), "W": (1.9, 2.8)}
|
|
17
|
+
T_WARM = -15.0 # degC
|
|
18
|
+
T_COLD = -40.0 # degC
|
|
19
|
+
|
|
14
20
|
|
|
15
21
|
def generate_iwc(
|
|
16
22
|
categorize_file: str | PathLike,
|
|
@@ -50,12 +56,12 @@ def generate_iwc(
|
|
|
50
56
|
iwc_source.append_icy_data(ice_classification)
|
|
51
57
|
iwc_source.append_bias()
|
|
52
58
|
iwc_source.append_sensitivity()
|
|
53
|
-
|
|
59
|
+
iwc_source.append_error(ice_classification)
|
|
54
60
|
iwc_source.append_status(ice_classification)
|
|
55
61
|
date = iwc_source.get_date()
|
|
56
62
|
attributes = output.add_time_attribute(IWC_ATTRIBUTES, date)
|
|
57
63
|
attributes = _add_iwc_comment(attributes, iwc_source)
|
|
58
|
-
attributes = _add_iwc_error_comment(attributes,
|
|
64
|
+
attributes = _add_iwc_error_comment(attributes, iwc_source.wl_band)
|
|
59
65
|
output.update_attributes(iwc_source.data, attributes)
|
|
60
66
|
output.save_product_file(product, iwc_source, output_file, uuid)
|
|
61
67
|
return uuid
|
|
@@ -74,9 +80,7 @@ class IwcSource(IceSource):
|
|
|
74
80
|
bias = self.getvar("Z_bias") * self.coefficients.Z * 10
|
|
75
81
|
self.append_data(bias, f"{self.product}_bias")
|
|
76
82
|
|
|
77
|
-
def append_error(
|
|
78
|
-
self, ice_classification: IceClassification
|
|
79
|
-
) -> tuple[float, float]:
|
|
83
|
+
def append_error(self, ice_classification: IceClassification) -> None:
|
|
80
84
|
"""Estimates error of ice water content."""
|
|
81
85
|
|
|
82
86
|
def _calc_random_error() -> npt.NDArray:
|
|
@@ -84,39 +88,28 @@ class IwcSource(IceSource):
|
|
|
84
88
|
scaled_temperature += self.coefficients.Z
|
|
85
89
|
return self.getvar("Z_error") * scaled_temperature * 10
|
|
86
90
|
|
|
87
|
-
def
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
+
def _calc_retrieval_uncertainty() -> npt.NDArray:
|
|
92
|
+
# Linear in temperature between the cold and warm values
|
|
93
|
+
warm, cold = RETRIEVAL_UNCERTAINTY[self.wl_band]
|
|
94
|
+
return np.interp(self.temperature, [T_COLD, T_WARM], [cold, warm])
|
|
91
95
|
|
|
92
|
-
|
|
93
|
-
retrieval_uncertainty = 1.7 # dB
|
|
96
|
+
retrieval_uncertainty = _calc_retrieval_uncertainty()
|
|
94
97
|
random_error = _calc_random_error()
|
|
95
|
-
error_uncorrected = _calc_error_in_uncorrected_ice()
|
|
96
98
|
iwc_error = utils.l2norm(retrieval_uncertainty, random_error)
|
|
97
|
-
iwc_error[ice_classification.uncorrected_ice] = utils.l2norm(
|
|
98
|
-
retrieval_uncertainty,
|
|
99
|
-
error_uncorrected,
|
|
100
|
-
)
|
|
101
99
|
iwc_error[~ice_classification.is_ice | ice_classification.uncorrected_ice] = (
|
|
102
100
|
ma.masked
|
|
103
101
|
)
|
|
104
102
|
self.append_data(iwc_error, f"{self.product}_error")
|
|
105
|
-
return lwp_prior, retrieval_uncertainty
|
|
106
103
|
|
|
107
104
|
|
|
108
|
-
def _add_iwc_error_comment(
|
|
109
|
-
|
|
110
|
-
) -> dict:
|
|
105
|
+
def _add_iwc_error_comment(attributes: dict, wl_band: str) -> dict:
|
|
106
|
+
warm, cold = RETRIEVAL_UNCERTAINTY[wl_band]
|
|
111
107
|
attributes["iwc_error"] = attributes["iwc_error"]._replace(
|
|
112
108
|
comment="This variable is an estimate of the one-standard-deviation random\n"
|
|
113
109
|
"error in ice water content due to both the uncertainty of the retrieval\n"
|
|
114
|
-
f"(about {
|
|
115
|
-
"
|
|
116
|
-
"
|
|
117
|
-
"correct for the associated attenuation, the error also includes a\n"
|
|
118
|
-
f"contribution equivalent to approximately {lwp_prior} g m-2 of liquid water\n"
|
|
119
|
-
"path being uncorrected for.",
|
|
110
|
+
f"(about {warm} dB between -20 and -10 degC, rising linearly to {cold} dB\n"
|
|
111
|
+
f"at -40 degC and below), and the random error in radar reflectivity\n"
|
|
112
|
+
"factor from which ice water content was calculated.",
|
|
120
113
|
)
|
|
121
114
|
return attributes
|
|
122
115
|
|
|
@@ -141,17 +134,15 @@ def _add_iwc_comment(attributes: dict, iwc: IwcSource) -> dict:
|
|
|
141
134
|
"supercooled drizzle will erroneously be identified as ice. Missing data\n"
|
|
142
135
|
"indicates either that ice cloud was present but it was only detected by\n"
|
|
143
136
|
"the lidar so its ice water content could not be estimated, or that there\n"
|
|
144
|
-
"was rain below the ice
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
"in the iwc_retrieval_status variable. There is some uncertainty
|
|
149
|
-
"procedure which is reflected by an increase in the associated
|
|
150
|
-
"in the iwc_error variable.
|
|
151
|
-
"
|
|
152
|
-
"
|
|
153
|
-
"attenuation. This is indicated by a value of 2 in the iwc_retrieval_status\n"
|
|
154
|
-
"variable, and an increase in the value of the iwc_error variable.",
|
|
137
|
+
"was liquid cloud, rain or melting layer below the ice whose attenuation\n"
|
|
138
|
+
"could not be corrected for. Where microwave radiometer liquid water path\n"
|
|
139
|
+
"and disdrometer rainfall rate were available they were used to correct the\n"
|
|
140
|
+
"radar for liquid, rain and melting layer attenuation; this is indicated by\n"
|
|
141
|
+
"a value of 3 in the iwc_retrieval_status variable. There is some uncertainty\n"
|
|
142
|
+
"in this procedure which is reflected by an increase in the associated\n"
|
|
143
|
+
"values in the iwc_error variable. Where no correction was possible, no\n"
|
|
144
|
+
"retrieval was performed; this is indicated by a value of 2 in the\n"
|
|
145
|
+
"iwc_retrieval_status variable.",
|
|
155
146
|
)
|
|
156
147
|
return attributes
|
|
157
148
|
|
|
@@ -177,8 +168,8 @@ DEFINITIONS = {
|
|
|
177
168
|
{
|
|
178
169
|
0: """No ice present.""",
|
|
179
170
|
1: """Reliable retrieval.""",
|
|
180
|
-
2: """
|
|
181
|
-
|
|
171
|
+
2: """No retrieval due to uncorrected liquid, rain or melting
|
|
172
|
+
layer attenuation.""",
|
|
182
173
|
3: """Retrieval performed with radar corrected for liquid, rain and
|
|
183
174
|
melting attenuation.""",
|
|
184
175
|
4: """Ice detected only by the lidar.""",
|
|
@@ -117,7 +117,7 @@ class LwcSource(DataSource):
|
|
|
117
117
|
) -> None:
|
|
118
118
|
self.append_data(lwc, "lwc", units="kg m-3")
|
|
119
119
|
self.append_data(status, "lwc_retrieval_status")
|
|
120
|
-
self.append_data(error, "lwc_error", units="
|
|
120
|
+
self.append_data(error, "lwc_error", units="1")
|
|
121
121
|
|
|
122
122
|
@staticmethod
|
|
123
123
|
def _get_atmosphere(
|
|
@@ -348,15 +348,16 @@ class LwcError:
|
|
|
348
348
|
return self._fill_error_array(combined_error)
|
|
349
349
|
|
|
350
350
|
def _calc_lwc_relative_error(self) -> npt.NDArray:
|
|
351
|
+
# Half a range gate uncertainty in cloud base and top height
|
|
351
352
|
lwc_gradient = self._calc_lwc_gradient()
|
|
352
353
|
error = lwc_gradient / self.lwc / 2
|
|
353
354
|
return self._limit_error(error, 5)
|
|
354
355
|
|
|
355
356
|
def _calc_lwc_gradient(self) -> npt.NDArray:
|
|
357
|
+
"""Returns absolute vertical gradient of LWC per range gate."""
|
|
356
358
|
if not isinstance(self.lwc, ma.MaskedArray):
|
|
357
359
|
self.lwc = ma.array(self.lwc)
|
|
358
|
-
|
|
359
|
-
return utils.l2norm(*gradient_elements)
|
|
360
|
+
return np.abs(np.gradient(self.lwc.filled(0), axis=1))
|
|
360
361
|
|
|
361
362
|
def _calc_lwp_relative_error(self) -> npt.NDArray:
|
|
362
363
|
err = self.lwc_source.lwp_error
|
|
@@ -412,9 +413,15 @@ COMMENTS = {
|
|
|
412
413
|
" liquid layers is difficult to ascertain."
|
|
413
414
|
),
|
|
414
415
|
"lwc_error": (
|
|
415
|
-
"This variable is an estimate of the random error
|
|
416
|
-
"
|
|
417
|
-
"
|
|
416
|
+
"This variable is an estimate of the one-standard-deviation random error\n"
|
|
417
|
+
"in liquid water content, expressed as a fraction of the liquid water\n"
|
|
418
|
+
"content. It combines the relative uncertainty in the microwave radiometer\n"
|
|
419
|
+
"liquid water path retrieval (limited to 10) and the uncertainty in cloud\n"
|
|
420
|
+
"base and cloud top height, taken as half a range gate and estimated from\n"
|
|
421
|
+
"the vertical gradient of liquid water content (limited to 5). If the liquid\n"
|
|
422
|
+
"layer is detected by the lidar only, there is the potential for cloud top\n"
|
|
423
|
+
"height to be underestimated. The error contribution from using the model\n"
|
|
424
|
+
"temperature and pressure at cloud base is assumed to be negligible."
|
|
418
425
|
),
|
|
419
426
|
"lwc_retrieval_status": (
|
|
420
427
|
"This variable describes whether a retrieval was performed for each pixel,\n"
|
|
@@ -469,9 +476,9 @@ LWC_ATTRIBUTES = {
|
|
|
469
476
|
dimensions=("time", "height"),
|
|
470
477
|
),
|
|
471
478
|
"lwc_error": MetaData(
|
|
472
|
-
long_name="
|
|
479
|
+
long_name="Relative random error in liquid water content",
|
|
473
480
|
comment=COMMENTS["lwc_error"],
|
|
474
|
-
units="
|
|
481
|
+
units="1",
|
|
475
482
|
dimensions=("time", "height"),
|
|
476
483
|
),
|
|
477
484
|
"lwc_retrieval_status": MetaData(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/gas_attenuation.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/liquid_attenuation.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/melting_attenuation.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/categorize/attenuations/rain_attenuation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/advance_methods.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/grid_methods.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/model_products.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/observation_products.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/products/product_resampling.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py
RENAMED
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.96.8 → cloudnetpy-1.97.1}/cloudnetpy/model_evaluation/tests/unit/test_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|