cloudnetpy 1.92.1__tar.gz → 1.92.2__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 (140) hide show
  1. {cloudnetpy-1.92.1/cloudnetpy.egg-info → cloudnetpy-1.92.2}/PKG-INFO +1 -1
  2. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/weather_station.py +50 -0
  3. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/plotting/plot_meta.py +3 -2
  4. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/plotting/plotting.py +1 -2
  5. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/der.py +44 -36
  6. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/epsilon_radar.py +7 -9
  7. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/version.py +1 -1
  8. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2/cloudnetpy.egg-info}/PKG-INFO +1 -1
  9. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/LICENSE +0 -0
  10. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/MANIFEST.in +0 -0
  11. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/README.md +0 -0
  12. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/__init__.py +0 -0
  13. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/__init__.py +0 -0
  14. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/atmos_utils.py +0 -0
  15. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuation.py +0 -0
  16. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  17. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  18. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  19. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  20. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  21. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/categorize.py +0 -0
  22. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/classify.py +0 -0
  23. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/containers.py +0 -0
  24. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/disdrometer.py +0 -0
  25. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/droplet.py +0 -0
  26. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/falling.py +0 -0
  27. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/freezing.py +0 -0
  28. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/insects.py +0 -0
  29. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/lidar.py +0 -0
  30. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/melting.py +0 -0
  31. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/model.py +0 -0
  32. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/mwr.py +0 -0
  33. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/radar.py +0 -0
  34. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/cli.py +0 -0
  35. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/cloudnetarray.py +0 -0
  36. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/concat_lib.py +0 -0
  37. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/constants.py +0 -0
  38. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/datasource.py +0 -0
  39. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/__init__.py +0 -0
  40. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/lpm.py +0 -0
  41. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/parsivel.py +0 -0
  42. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/rd80.py +0 -0
  43. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/utils.py +0 -0
  44. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/exceptions.py +0 -0
  45. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/__init__.py +0 -0
  46. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/basta.py +0 -0
  47. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/bowtie.py +0 -0
  48. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/ceilo.py +0 -0
  49. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/ceilometer.py +0 -0
  50. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/cl61d.py +0 -0
  51. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  52. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/copernicus.py +0 -0
  53. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/da10.py +0 -0
  54. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  55. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  56. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  57. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/rd80.py +0 -0
  58. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  59. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/fd12p.py +0 -0
  60. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/galileo.py +0 -0
  61. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/hatpro.py +0 -0
  62. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/instruments.py +0 -0
  63. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/lufft.py +0 -0
  64. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/mira.py +0 -0
  65. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/mrr.py +0 -0
  66. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/nc_lidar.py +0 -0
  67. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/nc_radar.py +0 -0
  68. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/pollyxt.py +0 -0
  69. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/radiometrics.py +0 -0
  70. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  71. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/rpg.py +0 -0
  72. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/rpg_reader.py +0 -0
  73. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/toa5.py +0 -0
  74. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/vaisala.py +0 -0
  75. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/weather_radar.py +0 -0
  76. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/metadata.py +0 -0
  77. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/__init__.py +0 -0
  78. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  79. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/metadata.py +0 -0
  80. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  81. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  82. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  83. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  84. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  85. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  86. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  87. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  88. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  89. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  90. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  91. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  92. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  93. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  94. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  95. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  96. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  97. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  98. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  99. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  100. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  101. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  102. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  103. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  104. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  105. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  106. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  107. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  108. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  109. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  110. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  111. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  112. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  113. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  114. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  115. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  116. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/utils.py +0 -0
  117. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/output.py +0 -0
  118. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/plotting/__init__.py +0 -0
  119. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/__init__.py +0 -0
  120. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/classification.py +0 -0
  121. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/drizzle.py +0 -0
  122. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/drizzle_error.py +0 -0
  123. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/drizzle_tools.py +0 -0
  124. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/epsilon_lidar.py +0 -0
  125. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/ier.py +0 -0
  126. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/iwc.py +0 -0
  127. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/lwc.py +0 -0
  128. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  129. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/mwr_tools.py +0 -0
  130. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/product_tools.py +0 -0
  131. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/py.typed +0 -0
  132. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/utils.py +0 -0
  133. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  134. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  135. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/entry_points.txt +0 -0
  136. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/requires.txt +0 -0
  137. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/top_level.txt +0 -0
  138. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/docs/source/conf.py +0 -0
  139. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/pyproject.toml +0 -0
  140. {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.92.1
3
+ Version: 1.92.2
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -76,6 +76,8 @@ def ws2nc(
76
76
  ws = MaidoWS(weather_station_file, site_meta)
77
77
  elif site_meta["name"] == "Cluj-Napoca":
78
78
  ws = ClujWS(weather_station_file, site_meta)
79
+ elif site_meta["name"] == "Falkenberg":
80
+ ws = FalkenbergWS(weather_station_file, site_meta)
79
81
  else:
80
82
  msg = "Unsupported site"
81
83
  raise ValueError(msg)
@@ -824,6 +826,54 @@ class ClujWS(WS):
824
826
  ) # mm/10min => m/s
825
827
 
826
828
 
829
+ class FalkenbergWS(WS):
830
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict) -> None:
831
+ if len(filenames) != 1:
832
+ raise ValueError
833
+ super().__init__(site_meta)
834
+ self.filename = filenames[0]
835
+ self._data = self._read_data()
836
+
837
+ def _read_data(self) -> dict:
838
+ keymap = {
839
+ "TIMESTAMP": "time",
840
+ "WS500_air_temperature": "air_temperature",
841
+ "WS500_relative_humidity": "relative_humidity",
842
+ "WS500_absolute_air_pressure": "air_pressure",
843
+ "WS500_wind_speed_avg": "wind_speed",
844
+ "WS500_wind_direction_avg": "wind_direction",
845
+ }
846
+ expected_units = {
847
+ "WS500_air_temperature": "degC",
848
+ "WS500_relative_humidity": "%",
849
+ "WS500_absolute_air_pressure": "hPa",
850
+ "WS500_wind_speed_avg": "m s-1",
851
+ "WS500_wind_direction_avg": "deg",
852
+ }
853
+ units, _process, rows = read_toa5(self.filename)
854
+ for key in units:
855
+ if key in expected_units and expected_units[key] != units[key]:
856
+ msg = (
857
+ f"Expected {key} to have units {expected_units[key]},"
858
+ f" got {units[key]} instead"
859
+ )
860
+ raise ValueError(msg)
861
+
862
+ data: dict[str, list] = {keymap[key]: [] for key in units if key in keymap}
863
+ for row in rows:
864
+ for key, value in row.items():
865
+ if key not in keymap:
866
+ continue
867
+ parsed = value
868
+ if keymap[key] != "time":
869
+ try:
870
+ parsed = float(value)
871
+ except ValueError:
872
+ parsed = math.nan
873
+ data[keymap[key]].append(parsed)
874
+ return self.format_data(data)
875
+
876
+
827
877
  ATTRIBUTES = {
828
878
  "visibility": MetaData(
829
879
  long_name="Meteorological optical range (MOR) visibility",
@@ -317,7 +317,7 @@ ATTRIBUTES = {
317
317
  log_scale=True,
318
318
  ),
319
319
  "N_scaled": PlotMeta(
320
- plot_range=(1.0e0, 1e3),
320
+ plot_range=(1.0e6, 1.0e9),
321
321
  log_scale=True,
322
322
  ),
323
323
  "der_error": PlotMeta(
@@ -414,6 +414,7 @@ ATTRIBUTES = {
414
414
  "cloud_fraction": PlotMeta(
415
415
  cmap="Blues",
416
416
  plot_range=(0, 1),
417
+ mask_zeros=True,
417
418
  ),
418
419
  "Tw": PlotMeta(
419
420
  cmap="RdBu_r",
@@ -428,7 +429,7 @@ ATTRIBUTES = {
428
429
  plot_range=(1e-5, 1e-2),
429
430
  log_scale=True,
430
431
  ),
431
- "rh": PlotMeta(plot_range=(0, 1.2)),
432
+ "rh": PlotMeta(plot_range=(0, 120)),
432
433
  "number_concentration": PlotMeta(
433
434
  plot_range=(1e-2, 1e3), log_scale=True, mask_zeros=True
434
435
  ),
@@ -410,6 +410,7 @@ class Plot:
410
410
  "precipitation_rate": (multiply, 3600000, "mm h$^{-1}$"),
411
411
  "air_pressure": (multiply, 0.01, "hPa"),
412
412
  "relative_humidity": (multiply, 100, "%"),
413
+ "rh": (multiply, 100, "%"),
413
414
  "rainfall_amount": (multiply, 1000, "mm"),
414
415
  "snowfall_amount": (multiply, 1000, "mm"),
415
416
  "precipitation_amount": (multiply, 1000, "mm"),
@@ -635,8 +636,6 @@ class Plot2D(Plot):
635
636
  else:
636
637
  min_x, max_x = 0, 24
637
638
  self._mark_gaps(figure_data, min_x=min_x, max_x=max_x)
638
- if self.sub_plot.variable.name == "cloud_fraction":
639
- self._data[self._data == 0] = ma.masked
640
639
  if any(
641
640
  key in self.sub_plot.variable.name for key in ("status", "classification")
642
641
  ):
@@ -24,11 +24,11 @@ from cloudnetpy.products.product_tools import (
24
24
 
25
25
  class Parameters(NamedTuple):
26
26
  ddBZ: float
27
- N: float
28
- dN: float
27
+ N: float # m-3
28
+ dN: float # m-3
29
29
  sigma_x: float
30
30
  dsigma_x: float
31
- dQ: float
31
+ dQ: float # kg m-2
32
32
 
33
33
 
34
34
  def generate_der(
@@ -76,8 +76,8 @@ def generate_der(
76
76
  der_source.append_der()
77
77
  der_source.append_retrieval_status(droplet_classification)
78
78
  date = der_source.get_date()
79
- attributes = output.add_time_attribute(REFF_ATTRIBUTES, date)
80
- attributes = _add_der_error_comment(attributes, der_source)
79
+ attributes = output.add_time_attribute(DER_ATTRIBUTES, date)
80
+ attributes = _add_der_error_comments(attributes, der_source)
81
81
  output.update_attributes(der_source.data, attributes)
82
82
  output.save_product_file("der", der_source, output_file, uuid)
83
83
  return uuid
@@ -132,7 +132,7 @@ class DerSource(DataSource):
132
132
  def append_der(self) -> None:
133
133
  """Estimate liquid droplet effective radius using Frisch et al. 2002."""
134
134
  params = self.parameters
135
- rho_l = 1000 # density of liquid water(kg m-3)
135
+ rho_l = 1000 # density of liquid water (kg m-3)
136
136
 
137
137
  var_x = params.sigma_x * params.sigma_x
138
138
 
@@ -140,7 +140,7 @@ class DerSource(DataSource):
140
140
  Z = utils.db2lin(Z)
141
141
  dZ = ma.abs(utils.db2lin(params.ddBZ)) * Z
142
142
 
143
- lwp = self.getvar("lwp")
143
+ lwp = self.getvar("lwp") # kg m-2
144
144
  lwp[lwp < 0] = 0
145
145
 
146
146
  der = np.zeros(Z.shape)
@@ -172,7 +172,7 @@ class DerSource(DataSource):
172
172
  # der formula (5)
173
173
  A = (Z[ind_t, idx_layer] / params.N) ** (1 / 6)
174
174
  B = ma.exp(-0.5 * var_x)
175
- der[ind_t, idx_layer] = 0.5 * A * B
175
+ der[ind_t, idx_layer] = 0.5 * A * B # mm
176
176
 
177
177
  # der error formula (7)
178
178
  A = params.dN / (6 * params.N)
@@ -180,26 +180,28 @@ class DerSource(DataSource):
180
180
  C = dZ[ind_t, idx_layer] / (6 * Z[ind_t, idx_layer])
181
181
  der_error[ind_t, idx_layer] = der[ind_t, idx_layer] * ma.sqrt(
182
182
  A * A + B * B + C * C,
183
- )
183
+ ) # mm
184
184
 
185
185
  # der scaled formula (6)
186
186
  A = Z[ind_t, idx_layer] ** (1 / 6) / (2 * lwp[ind_t] ** (1 / 3))
187
187
  B = (np.pi * rho_l / 6) ** (1 / 3)
188
188
  C = integral ** (1 / 3) * ma.exp(-2 * var_x)
189
- der_scaled[ind_t, idx_layer] = 1.0e-3 * A * B * C
189
+ der_scaled[ind_t, idx_layer] = 1.0e-3 * A * B * C # μm => mm
190
190
 
191
- # der scaled formula (9)
191
+ # solve N in der formula (5) assuming rₑ from der scaled formula (6)
192
192
  N_scaled[ind_t, idx_layer] = Z[ind_t, idx_layer] / (
193
193
  ((2 * der_scaled[ind_t, idx_layer]) / (ma.exp(-0.5 * var_x))) ** 6
194
- )
194
+ ) # m-3
195
+
196
+ # der scaled error formula (9)
195
197
  A = dZ[ind_t, idx_layer] / (6 * Z[ind_t, idx_layer])
196
198
  B = 4 * params.sigma_x * params.dsigma_x
197
199
  C = params.dQ / (3 * lwp[ind_t])
198
200
  der_scaled_error[ind_t, idx_layer] = der_scaled[ind_t, idx_layer] * ma.sqrt(
199
201
  A * A + B * B + C * C,
200
- )
202
+ ) # mm
201
203
 
202
- N_scaled = ma.masked_less_equal(ma.masked_invalid(N_scaled), 0.0) * 1.0e-6
204
+ N_scaled = ma.masked_less_equal(ma.masked_invalid(N_scaled), 0.0)
203
205
  der = ma.masked_less_equal(ma.masked_invalid(der), 0.0) * 1.0e-3
204
206
  der_error = ma.masked_less_equal(ma.masked_invalid(der_error), 0.0) * 1.0e-3
205
207
  der_scaled = ma.masked_less_equal(ma.masked_invalid(der_scaled), 0.0) * 1.0e-3
@@ -263,22 +265,20 @@ COMMENTS = {
263
265
  ),
264
266
  "der": (
265
267
  "This variable was calculated for the profiles where the categorization\n"
266
- "data has diagnosed that liquid water is present the cloud droplet\n"
267
- "effective radius is calculated after Frisch et al (2002), relating Z\n"
268
- "with def by assuming a lognormal size distribution its width and the\n"
269
- "number concentration of the cloud droplets."
268
+ "data has diagnosed that liquid water is present. The cloud droplet\n"
269
+ "effective radius is calculated using the method 1 of Frisch et al.\n"
270
+ "(2002), relating Z with effective radius by assuming a lognormal size\n"
271
+ "distribution and its width and the number concentration of the cloud\n"
272
+ "droplets."
270
273
  ),
271
274
  "der_scaled": (
272
- "This variable was calculated for the profiles where the\n"
273
- "categorization data has diagnosed that liquid water is present\n"
274
- "the cloud droplet effective radius is calculated after\n"
275
- "Frisch et al. (2002), relating Z with def by assuming a lognormal\n"
276
- "size distribution and its width. The number concentration required\n"
277
- "to represent the size distribution is derived by scaling the LWP\n "
278
- "measured with microwave radiometer over the observed (single) cloud layer."
279
- ),
280
- "der_scaled_error": (
281
- "This variable was calculated for the profiles where the categorization data"
275
+ "This variable was calculated for the profiles where the categorization\n"
276
+ "data has diagnosed that liquid water is present. The cloud droplet\n"
277
+ "effective radius is calculated using the method 2 of Frisch et al.\n"
278
+ "(2002), relating Z with effective radius by assuming a lognormal size\n"
279
+ "distribution and its width. The number concentration required to\n"
280
+ "represent the size distribution is derived by scaling the LWP measured\n"
281
+ "with microwave radiometer over the observed (single) cloud layer."
282
282
  ),
283
283
  "N_scaled": (
284
284
  "From scaled Frisch method the cloud droplet number concentration\n"
@@ -287,21 +287,28 @@ COMMENTS = {
287
287
  }
288
288
 
289
289
 
290
- def _add_der_error_comment(attributes: dict, der_source: DerSource) -> dict:
290
+ def _add_der_error_comments(attributes: dict, der_source: DerSource) -> dict:
291
291
  params = der_source.parameters
292
292
  attributes["der_error"] = attributes["der_error"]._replace(
293
293
  comment="This variable is an estimate of the random error in effective\n"
294
- f"radius assuming an error in Z of ddBZ = {params.ddBZ} in N of\n"
295
- f"dN = {params.dN} and in the spectral width dsigma_x = {params.dsigma_x}\n"
296
- f"and in the LWP Q of {params.dQ} kg m-3.",
294
+ f"radius assuming an error in Z of dZ = {params.ddBZ} dBZ, in N of\n"
295
+ f"dN = {params.dN} m-3, and in the spectral width of "
296
+ f"dsigma_x = {params.dsigma_x}."
297
+ )
298
+ attributes["der_scaled_error"] = attributes["der_scaled_error"]._replace(
299
+ comment="This variable is an estimate of the random error in scaled effective\n"
300
+ f"radius assuming an error in Z of dZ = {params.ddBZ} dBZ, in the spectral\n"
301
+ f"width of dsigma_x = {params.dsigma_x}, and in the LWP of dQ = {params.dQ} "
302
+ "kg m-2."
297
303
  )
298
304
  return attributes
299
305
 
300
306
 
301
- REFF_ATTRIBUTES = {
307
+ DER_ATTRIBUTES = {
302
308
  "comment": COMMENTS["general"],
303
309
  "der": MetaData(
304
310
  long_name="Droplet effective radius",
311
+ standard_name="effective_radius_of_cloud_liquid_water_particles",
305
312
  units="m",
306
313
  ancillary_variables="der_error",
307
314
  comment=COMMENTS["der"],
@@ -315,6 +322,7 @@ REFF_ATTRIBUTES = {
315
322
  ),
316
323
  "der_scaled": MetaData(
317
324
  long_name="Droplet effective radius (scaled to LWP)",
325
+ standard_name="effective_radius_of_cloud_liquid_water_particles",
318
326
  units="m",
319
327
  ancillary_variables="der_scaled_error",
320
328
  comment=COMMENTS["der_scaled"],
@@ -323,13 +331,13 @@ REFF_ATTRIBUTES = {
323
331
  "der_scaled_error": MetaData(
324
332
  long_name="Absolute error in droplet effective radius (scaled to LWP)",
325
333
  units="m",
326
- comment=COMMENTS["der_scaled_error"],
334
+ comment="",
327
335
  dimensions=("time", "height"),
328
336
  ),
329
337
  "N_scaled": MetaData(
330
338
  long_name="Cloud droplet number concentration",
331
- units="1",
332
- ancillary_variables="der_error der_scaled der_scaled_error",
339
+ standard_name="number_concentration_of_cloud_liquid_water_particles_in_air",
340
+ units="m-3",
333
341
  comment=COMMENTS["N_scaled"],
334
342
  dimensions=("time", "height"),
335
343
  ),
@@ -44,17 +44,15 @@ def generate_epsilon_from_radar(
44
44
  >>> generate_epsilon_from_radar('radar.nc', 'ecmwf.nc', 'epsilon.nc')
45
45
 
46
46
  References:
47
- Griesche, H. J., Seifert, P., Ansmann, A., Baars, H., Barrientos
48
- Velasco, C., Bühl, J., Engelmann, R., Radenz, M., Zhenping, Y., and
49
- Macke, A. (2020): Application of the shipborne remote sensing
47
+ Griesche et al. (2020). Application of the shipborne remote sensing
50
48
  supersite OCEANET for profiling of Arctic aerosols and clouds during
51
- Polarstern cruise PS106, Atmos. Meas. Tech., 13, 5335-5358,
52
- https://doi.org/10.5194/amt-13-5335-2020.
49
+ Polarstern cruise PS106. Atmos. Meas. Tech., 13(10), 5335-5358.
50
+ https://doi.org/10.5194/amt-13-5335-2020
51
+
52
+ Borque et al. (2016). On the unified estimation of turbulence eddy
53
+ dissipation rate using Doppler cloud radars and lidars. JGR Atmospheres,
54
+ 121(10), 5972-5989. https://doi.org/10.1002/2015JD024543
53
55
 
54
- Borque, P., Luke, E., and Kollias, P. (2016): On the unified
55
- estimation of turbulence eddy dissipation rate using Doppler cloud
56
- radars and lidars, J. Geophys. Res. Atmos., 120, 5972-5989,
57
- https://doi.org/10.1002/2015JD024543.
58
56
  """
59
57
  uuid = get_uuid(uuid)
60
58
  with (
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 92
3
- PATCH = 1
3
+ PATCH = 2
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.92.1
3
+ Version: 1.92.2
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