cloudnetpy 1.90.1__tar.gz → 1.90.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.90.1/cloudnetpy.egg-info → cloudnetpy-1.90.2}/PKG-INFO +1 -1
  2. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/weather_radar.py +56 -20
  3. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/version.py +1 -1
  4. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2/cloudnetpy.egg-info}/PKG-INFO +1 -1
  5. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/LICENSE +0 -0
  6. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/MANIFEST.in +0 -0
  7. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/README.md +0 -0
  8. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/__init__.py +0 -0
  9. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/__init__.py +0 -0
  10. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/atmos_utils.py +0 -0
  11. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/attenuation.py +0 -0
  12. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  13. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  14. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  15. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  16. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  17. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/categorize.py +0 -0
  18. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/classify.py +0 -0
  19. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/containers.py +0 -0
  20. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/disdrometer.py +0 -0
  21. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/droplet.py +0 -0
  22. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/falling.py +0 -0
  23. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/freezing.py +0 -0
  24. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/insects.py +0 -0
  25. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/itu.py +0 -0
  26. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/lidar.py +0 -0
  27. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/melting.py +0 -0
  28. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/model.py +0 -0
  29. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/mwr.py +0 -0
  30. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/categorize/radar.py +0 -0
  31. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/cli.py +0 -0
  32. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/cloudnetarray.py +0 -0
  33. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/concat_lib.py +0 -0
  34. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/constants.py +0 -0
  35. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/datasource.py +0 -0
  36. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/disdronator/__init__.py +0 -0
  37. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/disdronator/lpm.py +0 -0
  38. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/disdronator/parsivel.py +0 -0
  39. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/disdronator/rd80.py +0 -0
  40. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/disdronator/utils.py +0 -0
  41. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/exceptions.py +0 -0
  42. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/__init__.py +0 -0
  43. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/basta.py +0 -0
  44. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/bowtie.py +0 -0
  45. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/ceilo.py +0 -0
  46. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/ceilometer.py +0 -0
  47. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/cl61d.py +0 -0
  48. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  49. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/copernicus.py +0 -0
  50. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/da10.py +0 -0
  51. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  52. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  53. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  54. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/disdrometer/rd80.py +0 -0
  55. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  56. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/fd12p.py +0 -0
  57. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/galileo.py +0 -0
  58. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/hatpro.py +0 -0
  59. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/instruments.py +0 -0
  60. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/lufft.py +0 -0
  61. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/mira.py +0 -0
  62. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/mrr.py +0 -0
  63. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/nc_lidar.py +0 -0
  64. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/nc_radar.py +0 -0
  65. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/pollyxt.py +0 -0
  66. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/radiometrics.py +0 -0
  67. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  68. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/rpg.py +0 -0
  69. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/rpg_reader.py +0 -0
  70. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/toa5.py +0 -0
  71. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/vaisala.py +0 -0
  72. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/instruments/weather_station.py +0 -0
  73. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/metadata.py +0 -0
  74. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/__init__.py +0 -0
  75. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  76. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/metadata.py +0 -0
  77. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  78. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  79. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  80. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  81. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  82. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  83. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  84. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  85. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  86. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  87. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  88. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  89. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  90. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  91. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  92. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  93. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  94. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  95. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  96. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  97. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  98. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  99. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  100. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  101. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  102. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  103. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  104. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  105. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  106. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  107. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  108. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  109. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  110. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  111. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  112. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  113. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/model_evaluation/utils.py +0 -0
  114. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/output.py +0 -0
  115. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/plotting/__init__.py +0 -0
  116. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/plotting/plot_meta.py +0 -0
  117. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/plotting/plotting.py +0 -0
  118. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/__init__.py +0 -0
  119. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/classification.py +0 -0
  120. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/der.py +0 -0
  121. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/drizzle.py +0 -0
  122. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/drizzle_error.py +0 -0
  123. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/drizzle_tools.py +0 -0
  124. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/epsilon.py +0 -0
  125. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/ier.py +0 -0
  126. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/iwc.py +0 -0
  127. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/lwc.py +0 -0
  128. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  129. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/mwr_tools.py +0 -0
  130. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/products/product_tools.py +0 -0
  131. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/py.typed +0 -0
  132. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy/utils.py +0 -0
  133. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  134. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  135. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy.egg-info/entry_points.txt +0 -0
  136. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy.egg-info/requires.txt +0 -0
  137. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/cloudnetpy.egg-info/top_level.txt +0 -0
  138. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/docs/source/conf.py +0 -0
  139. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/pyproject.toml +0 -0
  140. {cloudnetpy-1.90.1 → cloudnetpy-1.90.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.90.1
3
+ Version: 1.90.2
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -11,9 +11,10 @@ from numpy import ma
11
11
 
12
12
  from cloudnetpy import output, utils
13
13
  from cloudnetpy.cloudnetarray import CloudnetArray
14
- from cloudnetpy.constants import CM_TO_M, HZ_TO_GHZ, SPEED_OF_LIGHT
14
+ from cloudnetpy.constants import CM_TO_M, HZ_TO_GHZ, M_TO_KM, SPEED_OF_LIGHT
15
15
  from cloudnetpy.instruments import instruments
16
16
  from cloudnetpy.instruments.cloudnet_instrument import CloudnetInstrument
17
+ from cloudnetpy.metadata import MetaData
17
18
 
18
19
 
19
20
  def wr2nc(
@@ -46,7 +47,7 @@ def wr2nc(
46
47
  wr.convert_to_cloudnet_arrays()
47
48
  wr.screen_noise()
48
49
  wr.add_meta()
49
- attributes = output.add_time_attribute({}, wr.date)
50
+ attributes = output.add_time_attribute(ATTRIBUTES, wr.date)
50
51
  output.update_attributes(wr.data, attributes)
51
52
  output.save_level1b(wr, output_file, uuid)
52
53
  return uuid
@@ -67,16 +68,25 @@ class WeatherRadar(CloudnetInstrument):
67
68
 
68
69
  def _read_data(self, filenames: Iterable[str | PathLike]) -> None:
69
70
  times = []
70
- data = defaultdict(list)
71
+ ranges = []
72
+ data = []
71
73
  for filename in filenames:
72
- file_time, file_range, file_data, file_freq = _read_opera_h5(filename)
74
+ file_time, file_range, file_data, file_scalars = _read_opera_h5(filename)
73
75
  times.append(file_time)
74
- for key, value in file_data.items():
75
- data[key].append(value)
76
+ ranges.append(file_range)
77
+ data.append(file_data)
78
+ target_range = max(ranges, key=lambda rng: rng[-1])
79
+ all_data = defaultdict(list)
80
+ for src_range, values in zip(ranges, data, strict=True):
81
+ for key, value in values.items():
82
+ block = ma.array([value])
83
+ if not np.array_equal(src_range, target_range):
84
+ block = utils.interpolate_2D_along_y(src_range, block, target_range)
85
+ all_data[key].append(block)
76
86
  self.raw_time = np.array(times)
77
- self.raw_range = file_range
78
- self.raw_data = {key: ma.concatenate(value) for key, value in data.items()}
79
- self.radar_frequency = file_freq
87
+ self.raw_range = target_range
88
+ self.raw_data = {key: ma.concatenate(value) for key, value in all_data.items()}
89
+ self.scalars = file_scalars
80
90
 
81
91
  def _screen_time(self, expected_date: datetime.date | None = None) -> None:
82
92
  if expected_date is None:
@@ -108,16 +118,23 @@ class WeatherRadar(CloudnetInstrument):
108
118
  self.data["range"] = CloudnetArray(self.raw_range, "range")
109
119
  self.data["height"] = CloudnetArray(height, "height")
110
120
  self.data["SNR"] = CloudnetArray(self.raw_data["SNR"], "SNR")
121
+ self.data["Zh"] = CloudnetArray(self.raw_data["ZH"], "Zh")
111
122
  self.data["v"] = CloudnetArray(self.raw_data["VRADH"], "v")
112
123
  self.data["width"] = CloudnetArray(self.raw_data["WRADH"], "width")
113
124
  self.data["zdr"] = CloudnetArray(self.raw_data["ZDR"], "zdr")
114
125
  self.data["rho_hv"] = CloudnetArray(self.raw_data["RHOHV"], "rho_hv")
115
126
  self.data["radar_frequency"] = CloudnetArray(
116
- self.radar_frequency, "radar_frequency"
127
+ self.scalars["FREQ"], "radar_frequency"
128
+ )
129
+ self.data["nyquist_velocity"] = CloudnetArray(
130
+ self.scalars["NI"], "nyquist_velocity"
131
+ )
132
+ self.data["calibration_reflectivity_factor"] = CloudnetArray(
133
+ self.scalars["NEZ"], "calibration_reflectivity_factor"
117
134
  )
118
135
 
119
136
  def screen_noise(self) -> None:
120
- is_noise = self.data["SNR"].data < -5
137
+ is_noise = self.data["SNR"].data < 0
121
138
  for cloudnet_array in self.data.values():
122
139
  if cloudnet_array.data.ndim == 2:
123
140
  cloudnet_array.mask_indices(is_noise)
@@ -125,21 +142,27 @@ class WeatherRadar(CloudnetInstrument):
125
142
 
126
143
  def _read_opera_h5(
127
144
  file: str | PathLike,
128
- ) -> tuple[datetime.datetime, npt.NDArray, dict[str, list], float]:
129
- all_data = defaultdict(list)
145
+ ) -> tuple[datetime.datetime, npt.NDArray, dict[str, npt.NDArray], dict[str, float]]:
146
+ all_data = {}
130
147
  with netCDF4.Dataset(file) as rootgrp:
131
148
  date = rootgrp["what"].date
132
149
  time = rootgrp["what"].time
133
150
  dt = datetime.datetime.strptime(date + time, "%Y%m%d%H%M%S")
134
151
 
135
- wavelength = rootgrp["how"].wavelength * CM_TO_M
136
- frequency = HZ_TO_GHZ * SPEED_OF_LIGHT / wavelength
137
-
138
152
  dataset = rootgrp["dataset1"]
139
153
  nbins = dataset["where"].nbins
154
+ # NOTE: rstart is documented to be in km, but it's actually in m at
155
+ # least for FMI radars.
140
156
  rstart = dataset["where"].nbins
141
- rscale = dataset["where"].rscale
142
- rng = rstart + rscale * np.arange(nbins)
157
+ rscale = dataset["where"].rscale # m
158
+ halfbin = rscale / 2
159
+ rng = rstart + halfbin + rscale * np.arange(nbins)
160
+
161
+ nez = dataset["how"].NEZH
162
+ ni = dataset["how"].NI
163
+ wavelength = rootgrp["how"].wavelength * CM_TO_M
164
+ frequency = HZ_TO_GHZ * SPEED_OF_LIGHT / wavelength
165
+ scalars = {"NEZ": nez, "NI": ni, "FREQ": frequency}
143
166
 
144
167
  grpnames = [group for group in dataset.groups if group.startswith("data")]
145
168
  for grpname in grpnames:
@@ -158,6 +181,19 @@ def _read_opera_h5(
158
181
  grpdata = ma.mean(grpdata, axis=0)
159
182
  if is_db:
160
183
  grpdata = utils.lin2db(grpdata)
161
- all_data[quantity].append(grpdata)
184
+ all_data[quantity] = grpdata
185
+
186
+ all_data["ZH"] = all_data["SNR"] + nez + 20 * np.log10(rng * M_TO_KM)
187
+
188
+ return dt, rng, all_data, scalars
189
+
162
190
 
163
- return dt, rng, all_data, frequency
191
+ ATTRIBUTES = {
192
+ "calibration_reflectivity_factor": MetaData(
193
+ long_name="Calibration reflectivity factor",
194
+ comment="This parameter is the equivalent radar reflectivity factor at 1 km\n"
195
+ "when the return signal power is equal to the noise power (SNR=0 dB).",
196
+ units="dBZ",
197
+ dimensions=(),
198
+ )
199
+ }
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 90
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.90.1
3
+ Version: 1.90.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