cloudnetpy 1.96.7__tar.gz → 1.97.0__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.
Files changed (148) hide show
  1. {cloudnetpy-1.96.7/cloudnetpy.egg-info → cloudnetpy-1.97.0}/PKG-INFO +1 -1
  2. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/arm.py +2 -0
  3. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/radar.py +1 -0
  4. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/plotting/plotting.py +12 -13
  5. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/ier.py +1 -1
  6. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/iwc.py +31 -40
  7. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/version.py +2 -2
  8. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0/cloudnetpy.egg-info}/PKG-INFO +1 -1
  9. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/LICENSE +0 -0
  10. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/MANIFEST.in +0 -0
  11. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/README.md +0 -0
  12. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/__init__.py +0 -0
  13. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/__init__.py +0 -0
  14. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/atmos_utils.py +0 -0
  15. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/attenuation.py +0 -0
  16. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  17. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  18. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  19. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  20. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  21. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/categorize.py +0 -0
  22. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/classify.py +0 -0
  23. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/containers.py +0 -0
  24. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/disdrometer.py +0 -0
  25. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/droplet.py +0 -0
  26. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/falling.py +0 -0
  27. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/freezing.py +0 -0
  28. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/insects.py +0 -0
  29. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/lidar.py +0 -0
  30. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/melting.py +0 -0
  31. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/model.py +0 -0
  32. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/categorize/mwr.py +0 -0
  33. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/cli.py +0 -0
  34. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/cloudnetarray.py +0 -0
  35. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/concat_lib.py +0 -0
  36. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/constants.py +0 -0
  37. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/datasource.py +0 -0
  38. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/disdronator/__init__.py +0 -0
  39. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/disdronator/lpm.py +0 -0
  40. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/disdronator/parsivel.py +0 -0
  41. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/disdronator/process.py +0 -0
  42. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/disdronator/rd80.py +0 -0
  43. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/disdronator/utils.py +0 -0
  44. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/exceptions.py +0 -0
  45. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/__init__.py +0 -0
  46. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/arm_ceilo.py +0 -0
  47. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/arm_ld.py +0 -0
  48. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/arm_utils.py +0 -0
  49. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/basta.py +0 -0
  50. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/bowtie.py +0 -0
  51. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/ceilo.py +0 -0
  52. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/ceilometer.py +0 -0
  53. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/cl61d.py +0 -0
  54. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  55. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/copernicus.py +0 -0
  56. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/da10.py +0 -0
  57. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/dealias.py +0 -0
  58. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/disdrometer.py +0 -0
  59. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/fd12p.py +0 -0
  60. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/galileo.py +0 -0
  61. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/hatpro.py +0 -0
  62. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/instruments.py +0 -0
  63. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/kazr.py +0 -0
  64. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/lufft.py +0 -0
  65. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/mira.py +0 -0
  66. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/mmcr.py +0 -0
  67. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/mrr.py +0 -0
  68. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/mwr3c.py +0 -0
  69. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/mwrlos.py +0 -0
  70. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/nc_lidar.py +0 -0
  71. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/nc_radar.py +0 -0
  72. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/pollyxt.py +0 -0
  73. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/radiometrics.py +0 -0
  74. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  75. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/rpg.py +0 -0
  76. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/rpg_reader.py +0 -0
  77. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/toa5.py +0 -0
  78. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/vaisala.py +0 -0
  79. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/weather_radar.py +0 -0
  80. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/instruments/weather_station.py +0 -0
  81. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/metadata.py +0 -0
  82. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/__init__.py +0 -0
  83. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  84. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/metadata.py +0 -0
  85. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  86. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  87. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  88. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  89. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  90. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  91. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  92. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  93. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  94. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  95. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  96. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  97. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  98. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  99. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  100. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  101. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  102. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  103. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  104. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  105. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  106. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  107. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  108. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  109. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  110. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  111. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  112. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  113. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  114. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  115. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  116. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  117. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  118. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  119. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  120. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  121. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/model_evaluation/utils.py +0 -0
  122. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/output.py +0 -0
  123. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/plotting/__init__.py +0 -0
  124. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/plotting/plot_meta.py +0 -0
  125. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/__init__.py +0 -0
  126. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/classification.py +0 -0
  127. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/cod.py +0 -0
  128. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/der.py +0 -0
  129. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/drizzle.py +0 -0
  130. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/drizzle_error.py +0 -0
  131. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/drizzle_tools.py +0 -0
  132. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/epsilon_lidar.py +0 -0
  133. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/epsilon_radar.py +0 -0
  134. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/iwc_weather_radar.py +0 -0
  135. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/lwc.py +0 -0
  136. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  137. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/mwr_tools.py +0 -0
  138. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/products/product_tools.py +0 -0
  139. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/py.typed +0 -0
  140. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy/utils.py +0 -0
  141. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  142. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  143. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy.egg-info/entry_points.txt +0 -0
  144. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy.egg-info/requires.txt +0 -0
  145. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/cloudnetpy.egg-info/top_level.txt +0 -0
  146. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/docs/source/conf.py +0 -0
  147. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/pyproject.toml +0 -0
  148. {cloudnetpy-1.96.7 → cloudnetpy-1.97.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.96.7
3
+ Version: 1.97.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -49,6 +49,8 @@ ARM_SITES: Final = {
49
49
  "arm-oliktok": ("oli", "M1"),
50
50
  "arm-sgp": ("sgp", "C1"),
51
51
  "arm-yacanto": ("cor", "M1"),
52
+ "arm-phoenix": ("dst", "M1"),
53
+ "arm-bankhead": ("bnf", "M1"),
52
54
  }
53
55
 
54
56
 
@@ -270,6 +270,7 @@ class Radar(DataSource):
270
270
 
271
271
  z_error = utils.l2norm(
272
272
  z_precision,
273
+ attenuations.gas.error,
273
274
  attenuations.liquid.error.filled(0),
274
275
  attenuations.rain.error.filled(0),
275
276
  attenuations.melting.error.filled(0),
@@ -725,29 +725,28 @@ class Plot2D(Plot):
725
725
  if figure_data.is_mwrpy_product():
726
726
  self._fill_flagged_data(figure_data)
727
727
 
728
- if figure_data.variables[0].name == "signal_source_status":
728
+ if self.sub_plot.variable.name == "signal_source_status":
729
729
  self._indicate_rainy_profiles(figure_data)
730
730
 
731
731
  def _indicate_rainy_profiles(self, figure_data: FigureData) -> None:
732
732
  if "rain_detected" not in figure_data.file.variables:
733
733
  return
734
- rain = figure_data.file.variables["rain_detected"][:]
735
- is_rain: ma.MaskedArray = ma.array(np.zeros_like(rain), mask=(rain == 0))
736
- if is_rain.mask.all():
734
+ is_rain = figure_data.file.variables["rain_detected"][:] == 1
735
+ if not is_rain.any():
737
736
  return
738
- self._ax.plot(
737
+ self._ax.fill_between(
739
738
  figure_data.time,
740
- is_rain,
741
- color="red",
742
- marker="|",
743
- linestyle="None",
744
- markersize=10,
745
- zorder=-999,
739
+ *self._get_y_limits(),
740
+ where=is_rain,
741
+ step="mid",
742
+ facecolor="#1f77b4",
743
+ alpha=0.18,
744
+ linewidth=0,
746
745
  label="Rain",
746
+ zorder=_get_zorder("flags"),
747
747
  )
748
748
  self._ax.legend(
749
- markerscale=0.75,
750
- numpoints=1,
749
+ loc="upper right",
751
750
  frameon=False,
752
751
  )
753
752
 
@@ -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 Grieche
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
- lwp_prior, bias = iwc_source.append_error(ice_classification)
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, lwp_prior, bias)
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 _calc_error_in_uncorrected_ice() -> float:
88
- spec_liq_atten = 1.0 if self.wl_band == "Ka" else 4.5
89
- liq_atten_scaled = spec_liq_atten * self.coefficients.Z
90
- return lwp_prior * G_TO_KG * liq_atten_scaled * 2 * 10
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
- lwp_prior = 250 # g m-2
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
- attributes: dict, lwp_prior: float, uncertainty: float
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 {uncertainty} dB), and the random error in radar reflectivity\n"
115
- "factor from which ice water content was calculated. When liquid water is\n"
116
- "present beneath the ice but no microwave radiometer data were available to\n"
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 associated with uncertain attenuation of the\n"
145
- "reflectivities in the ice. Note that where microwave radiometer liquid water\n"
146
- "path was available it was used to correct the radar for liquid attenuation\n"
147
- "when liquid cloud occurred below the ice; this is indicated a value of 3\n"
148
- "in the iwc_retrieval_status variable. There is some uncertainty in this\n"
149
- "procedure which is reflected by an increase in the associated values\n"
150
- "in the iwc_error variable. When microwave radiometer data were not available\n"
151
- "and liquid cloud occurred below the ice, the retrieval was still performed\n"
152
- "but its reliability is questionable due to the uncorrected liquid water\n"
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: """Unreliable retrieval due to uncorrected liquid, rain or
181
- melting attenuation.""",
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.""",
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 96
3
- PATCH = 7
2
+ MINOR = 97
3
+ PATCH = 0
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.96.7
3
+ Version: 1.97.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
File without changes
File without changes
File without changes
File without changes
File without changes