cloudnetpy 1.66.18__py3-none-any.whl → 1.67.0__py3-none-any.whl

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.
@@ -340,3 +340,18 @@ def normalize_lwc_by_lwp(
340
340
  theoretical_lwp = ma.sum(lwc_adiabatic * path_lengths, axis=1)
341
341
  scaling_factors = lwp / theoretical_lwp
342
342
  return lwc_adiabatic * utils.transpose(scaling_factors)
343
+
344
+
345
+ def calc_altitude(temperature: float, pressure: float) -> float:
346
+ """Calculate altitude (m) based on observed pressure (Pa) and temperature (K)
347
+ using the International Standard Atmosphere (ISA) model.
348
+
349
+ Args:
350
+ temperature: Observed temperature (K).
351
+ pressure: Observed atmospheric pressure (Pa).
352
+
353
+ Returns:
354
+ Altitude (m).
355
+ """
356
+ L = 0.0065 # Temperature lapse rate (K/m)
357
+ return (temperature / L) * (1 - (pressure / con.P0) ** (con.RS * L / con.G))
@@ -40,7 +40,7 @@ def calc_melting_attenuation(
40
40
  amount[amount == 0] = ma.masked
41
41
 
42
42
  band = utils.get_wl_band(data.radar.radar_frequency)
43
- error_factor = 0.2 if band == 0 else 0.1
43
+ error_factor = {"Ka": 0.2, "W": 0.1}[band]
44
44
 
45
45
  error = amount * error_factor
46
46
  error[~affected_region] = ma.masked
@@ -65,9 +65,10 @@ def _calc_melting_attenuation(
65
65
  Research: Atmospheres, 124, 9520–9533. https://doi.org/10.1029/2019JD030316
66
66
 
67
67
  """
68
- if frequency > 34 and frequency < 37:
68
+ band = utils.get_wl_band(frequency)
69
+ if band == "Ka":
69
70
  a, b = 0.97, 0.61
70
- elif frequency > 93 and frequency < 96:
71
+ elif band == "W":
71
72
  a, b = 2.9, 0.42
72
73
  else:
73
74
  msg = "Radar frequency not supported"
cloudnetpy/constants.py CHANGED
@@ -14,6 +14,9 @@ RS: Final = 287.058
14
14
  # ice density kg m-3
15
15
  RHO_ICE: Final = 917
16
16
 
17
+ # Standard atmospheric pressure at sea level Pa
18
+ P0: Final = 1013_25
19
+
17
20
  # other
18
21
  SPEED_OF_LIGHT: Final = 3.0e8
19
22
  SEC_IN_MINUTE: Final = 60
@@ -30,3 +33,4 @@ PA_TO_HPA: Final = 1 / HPA_TO_PA
30
33
  KM_H_TO_M_S: Final = 1000 / SEC_IN_HOUR
31
34
  M_TO_KM: Final = 1e-3
32
35
  TWO_WAY: Final = 2
36
+ G: Final = 9.80665
@@ -52,14 +52,12 @@ class CloudnetInstrument:
52
52
  return float(new_str)
53
53
 
54
54
  def add_height(self) -> None:
55
- try:
56
- zenith_angle = ma.median(self.data["zenith_angle"].data)
57
- except RuntimeError:
55
+ zenith_angle = self._get_zenith_angle()
56
+ if zenith_angle is None:
58
57
  logging.warning("Assuming 0 deg zenith_angle")
59
58
  zenith_angle = 0
60
59
  height = utils.range_to_height(self.data["range"].data, zenith_angle)
61
60
  height += self.data["altitude"].data
62
- height = np.array(height)
63
61
  self.data["height"] = CloudnetArray(height, "height")
64
62
 
65
63
  def linear_to_db(self, variables_to_log: tuple) -> None:
@@ -106,3 +104,11 @@ class CloudnetInstrument:
106
104
  return self.data["time"].data[:]
107
105
  except KeyError:
108
106
  return self.time
107
+
108
+ def _get_zenith_angle(self) -> float | None:
109
+ if "zenith_angle" not in self.data or self.data["zenith_angle"].data.size == 0:
110
+ return None
111
+ zenith_angle = ma.median(self.data["zenith_angle"].data)
112
+ if np.isnan(zenith_angle) or zenith_angle is ma.masked:
113
+ return None
114
+ return zenith_angle
@@ -75,6 +75,14 @@ CHM15KX = Instrument(
75
75
  wavelength=1064.0,
76
76
  )
77
77
 
78
+ MIRA10 = Instrument(
79
+ manufacturer="METEK",
80
+ domain="radar",
81
+ category="cloud radar",
82
+ model="MIRA-10",
83
+ frequency=9.4, # 9.2 - 9.6 GHz
84
+ )
85
+
78
86
  MIRA35 = Instrument(
79
87
  manufacturer="METEK",
80
88
  domain="radar",
@@ -142,11 +150,18 @@ HALO = Instrument(
142
150
  model="StreamLine",
143
151
  )
144
152
 
145
- WINDCUBE = Instrument(
146
- manufacturer="Leosphere",
153
+ WINDCUBE_WLS200S = Instrument(
154
+ manufacturer="Vaisala",
155
+ domain="lidar",
156
+ category="Doppler lidar",
157
+ model="WindCube WLS200S",
158
+ )
159
+
160
+ WINDCUBE_WLS70 = Instrument(
161
+ manufacturer="Vaisala",
147
162
  domain="lidar",
148
163
  category="Doppler lidar",
149
- model="WindCube",
164
+ model="WindCube WLS70",
150
165
  )
151
166
 
152
167
  PARSIVEL2 = Instrument(
@@ -8,7 +8,7 @@ from tempfile import NamedTemporaryFile, TemporaryDirectory
8
8
  from numpy import ma
9
9
 
10
10
  from cloudnetpy import concat_lib, output, utils
11
- from cloudnetpy.instruments.instruments import MIRA35
11
+ from cloudnetpy.instruments.instruments import MIRA10, MIRA35
12
12
  from cloudnetpy.instruments.nc_radar import NcRadar
13
13
  from cloudnetpy.metadata import MetaData
14
14
 
@@ -99,7 +99,13 @@ class Mira(NcRadar):
99
99
  def __init__(self, full_path: str, site_meta: dict):
100
100
  super().__init__(full_path, site_meta)
101
101
  self.date = self._init_mira_date()
102
- self.instrument = MIRA35
102
+ if "model" not in site_meta or site_meta["model"] == "mira-35":
103
+ self.instrument = MIRA35
104
+ elif site_meta["model"] == "mira-10":
105
+ self.instrument = MIRA10
106
+ else:
107
+ msg = f"Invalid model: {site_meta['model']}"
108
+ raise ValueError(msg)
103
109
 
104
110
  def screen_by_date(self, expected_date: str) -> None:
105
111
  """Screens incorrect time stamps."""
@@ -112,7 +112,7 @@ class ObservationManager(DataSource):
112
112
  raise RuntimeError(msg)
113
113
  wband = utils.get_wl_band(float(self.radar_freq))
114
114
  rainrate_threshold = 8
115
- if 90 < wband < 100:
115
+ if wband == "W":
116
116
  rainrate_threshold = 2
117
117
  return rainrate_threshold
118
118
 
@@ -21,7 +21,8 @@ from mpl_toolkits.axes_grid1 import make_axes_locatable
21
21
  from numpy import ma, ndarray
22
22
  from scipy.ndimage import uniform_filter
23
23
 
24
- from cloudnetpy.constants import T0
24
+ from cloudnetpy import constants as con
25
+ from cloudnetpy.categorize.atmos_utils import calc_altitude
25
26
  from cloudnetpy.exceptions import PlottingError
26
27
  from cloudnetpy.instruments.ceilometer import calc_sigma_units
27
28
  from cloudnetpy.plotting.plot_meta import ATTRIBUTES, PlotMeta
@@ -45,6 +46,9 @@ class PlotParameters:
45
46
  plot_meta: Additional metadata for the plot.
46
47
  raise_on_empty: Whether to raise an error if no data is found for a
47
48
  plotted variable.
49
+ minor_ticks: Whether to display minor ticks on the x-axis.
50
+ plot_above_ground: Whether to plot above ground instead of above mean sea level.
51
+
48
52
  """
49
53
 
50
54
  dpi: float = 120
@@ -58,6 +62,8 @@ class PlotParameters:
58
62
  footer_text: str | None = None
59
63
  plot_meta: PlotMeta | None = None
60
64
  raise_on_empty: bool = False
65
+ minor_ticks: bool = False
66
+ plot_above_ground: bool = False
61
67
 
62
68
 
63
69
  class Dimensions:
@@ -170,15 +176,35 @@ class FigureData:
170
176
  m2mm = 1e3
171
177
  file_type = getattr(self.file, "cloudnet_file_type", "")
172
178
  if file_type == "model":
173
- return ma.mean(self.file.variables["height"][:], axis=0) * m2km
179
+ height = ma.mean(self.file.variables["height"][:], axis=0) # height AGL
180
+ if not self.options.plot_above_ground:
181
+ site_alt = self._calc_ground_altitude()
182
+ height += site_alt
183
+ return height * m2km
174
184
  if "height" in self.file.variables:
175
- return self.file.variables["height"][:] * m2km
185
+ height = self.file.variables["height"][:] # height AMSL
186
+ if self.options.plot_above_ground:
187
+ if "altitude" not in self.file.variables:
188
+ msg = "No altitude information in the file."
189
+ raise ValueError(msg)
190
+ height -= self.file.variables["altitude"][:]
191
+ return height * m2km
176
192
  if "range" in self.file.variables:
177
193
  return self.file.variables["range"][:] * m2km
178
194
  if "diameter" in self.file.variables:
179
195
  return self.file.variables["diameter"][:] * m2mm
180
196
  return None
181
197
 
198
+ def _calc_ground_altitude(self) -> float:
199
+ if (
200
+ "sfc_geopotential" in self.file.variables
201
+ and "gdas1" not in self.file.source.lower() # uncertain unit in gdas1
202
+ ):
203
+ return np.mean(self.file.variables["sfc_geopotential"][:]) / con.G
204
+ pressure = ma.mean(self.file.variables["pressure"][:, 0])
205
+ temperature = ma.mean(self.file.variables["temperature"][:, 0])
206
+ return calc_altitude(temperature, pressure)
207
+
182
208
  def is_mwrpy_product(self) -> bool:
183
209
  cloudnet_file_type = getattr(self.file, "cloudnet_file_type", "")
184
210
  return cloudnet_file_type in ("mwr-single", "mwr-multi")
@@ -198,7 +224,8 @@ class SubPlot:
198
224
  self.ax = ax
199
225
  self.variable = variable
200
226
  self.options = options
201
- self.plot_meta = self._read_plot_meta(file_type)
227
+ self.file_type = file_type
228
+ self.plot_meta = self._read_plot_meta()
202
229
 
203
230
  def set_xax(self) -> None:
204
231
  resolution = 4
@@ -210,6 +237,9 @@ class SubPlot:
210
237
  ]
211
238
  self.ax.set_xticks(np.arange(0, 25, resolution, dtype=int))
212
239
  self.ax.set_xticklabels(x_tick_labels, fontsize=12)
240
+ if self.options.minor_ticks:
241
+ self.ax.xaxis.set_minor_locator(AutoMinorLocator(4))
242
+ self.ax.tick_params(which="minor", length=2.5)
213
243
  self.ax.set_xlim(0, 24)
214
244
 
215
245
  def set_yax(
@@ -217,7 +247,11 @@ class SubPlot:
217
247
  ylabel: str | None = None,
218
248
  y_limits: tuple[float, float] | None = None,
219
249
  ) -> None:
220
- label = ylabel if ylabel is not None else "Height (km)"
250
+ height_str = (
251
+ "Height (km AGL)" if self.options.plot_above_ground else "Height (km AMSL)"
252
+ )
253
+
254
+ label = ylabel if ylabel is not None else height_str
221
255
  self.ax.set_ylabel(label, fontsize=13)
222
256
  if y_limits is not None:
223
257
  self.ax.set_ylim(*y_limits)
@@ -282,12 +316,12 @@ class SubPlot:
282
316
  va="bottom",
283
317
  )
284
318
 
285
- def _read_plot_meta(self, file_type: str | None) -> PlotMeta:
319
+ def _read_plot_meta(self) -> PlotMeta:
286
320
  if self.options.plot_meta is not None:
287
321
  plot_meta = self.options.plot_meta
288
322
  else:
289
323
  fallback = ATTRIBUTES["fallback"].get(self.variable.name, PlotMeta())
290
- file_attributes = ATTRIBUTES.get(file_type or "", {})
324
+ file_attributes = ATTRIBUTES.get(self.file_type or "", {})
291
325
  plot_meta = file_attributes.get(self.variable.name, fallback)
292
326
  if plot_meta.clabel is None:
293
327
  plot_meta = plot_meta._replace(clabel=_reformat_units(self.variable.units))
@@ -542,7 +576,7 @@ class Plot2D(Plot):
542
576
  self._plot_contour(
543
577
  figure_data,
544
578
  alt,
545
- levels=np.array([T0]),
579
+ levels=np.array([con.T0]),
546
580
  colors="gray",
547
581
  linewidths=1.25,
548
582
  linestyles="dashed",
@@ -910,6 +944,7 @@ def _get_max_gap_in_minutes(figure_data: FigureData) -> float:
910
944
  "mwr-multi": 35,
911
945
  "weather-station": 12,
912
946
  "doppler-lidar-wind": 75,
947
+ "doppler-lidar": 75,
913
948
  "radar": 5,
914
949
  }
915
950
  return max_allowed_gap.get(file_type, 10)
@@ -72,7 +72,12 @@ class DrizzleSource(DataSource):
72
72
  """Returns string corresponding the radar frequency."""
73
73
  radar_frequency = float(self.getvar("radar_frequency"))
74
74
  wl_band = utils.get_wl_band(radar_frequency)
75
- return "35" if wl_band == 0 else "94"
75
+ if wl_band == "Ka":
76
+ return "35"
77
+ if wl_band == "W":
78
+ return "94"
79
+ msg = f"Unsupported band: {wl_band}"
80
+ raise ValueError(msg)
76
81
 
77
82
 
78
83
  class DrizzleClassification(ProductClassification):
@@ -3,7 +3,7 @@
3
3
  import numpy as np
4
4
  from numpy import ma
5
5
 
6
- from cloudnetpy import constants, output, utils
6
+ from cloudnetpy import constants, output
7
7
  from cloudnetpy.metadata import MetaData
8
8
  from cloudnetpy.products.iwc import DEFINITIONS as IWC_DEFINITION
9
9
  from cloudnetpy.products.product_tools import IceClassification, IceSource
@@ -83,7 +83,7 @@ class IerSource(IceSource):
83
83
 
84
84
 
85
85
  def _add_ier_comment(attributes: dict, ier: IerSource) -> dict:
86
- freq = utils.get_frequency(ier.wl_band)
86
+ freq = ier.radar_frequency
87
87
  coeffs = ier.coefficients
88
88
  factor = np.round((coeffs[0] / 0.93), 3)
89
89
  attributes["ier"] = attributes["ier"]._replace(
@@ -113,7 +113,7 @@ def _add_iwc_error_comment(attributes: dict, lwp_prior, uncertainty: float) -> d
113
113
 
114
114
 
115
115
  def _add_iwc_comment(attributes: dict, iwc: IwcSource) -> dict:
116
- freq = utils.get_frequency(iwc.wl_band)
116
+ freq = iwc.radar_frequency
117
117
  coeffs = iwc.coefficients
118
118
  factor = round((coeffs[0] / 0.93) * 1000) / 1000
119
119
  attributes["iwc"] = attributes["iwc"]._replace(
@@ -181,7 +181,8 @@ class IceSource(DataSource):
181
181
 
182
182
  def __init__(self, categorize_file: str, product: str):
183
183
  super().__init__(categorize_file)
184
- self.wl_band = utils.get_wl_band(float(self.getvar("radar_frequency")))
184
+ self.radar_frequency = float(self.getvar("radar_frequency"))
185
+ self.wl_band = utils.get_wl_band(self.radar_frequency)
185
186
  self.temperature = _get_temperature(categorize_file)
186
187
  self.product = product
187
188
  self.coefficients = self._get_coefficients()
@@ -216,13 +217,18 @@ class IceSource(DataSource):
216
217
  References:
217
218
  Hogan et.al. 2006, https://doi.org/10.1175/JAM2340.1
218
219
  """
220
+ msg = f"Unsupported band: {self.wl_band}"
219
221
  if self.product == "ier":
220
- if self.wl_band == 0:
222
+ if self.wl_band == "Ka":
221
223
  return IceCoefficients(0.878, -0.000205, -0.0015, 0.0016, -1.52)
222
- return IceCoefficients(0.669, -0.000296, -0.00193, -0.000, -1.502)
223
- if self.wl_band == 0:
224
+ if self.wl_band == "W":
225
+ return IceCoefficients(0.669, -0.000296, -0.00193, -0.000, -1.502)
226
+ raise ValueError(msg)
227
+ if self.wl_band == "Ka":
224
228
  return IceCoefficients(0.878, 0.000242, -0.0186, 0.0699, -1.63)
225
- return IceCoefficients(0.669, 0.000580, -0.00706, 0.0923, -0.992)
229
+ if self.wl_band == "W":
230
+ return IceCoefficients(0.669, 0.000580, -0.00706, 0.0923, -0.992)
231
+ raise ValueError(msg)
226
232
 
227
233
  def _convert_z(self, z_variable: str = "Z") -> np.ndarray:
228
234
  """Calculates temperature weighted z, i.e. ice effective radius [m]."""
cloudnetpy/utils.py CHANGED
@@ -691,22 +691,24 @@ def get_uuid() -> str:
691
691
  return str(uuid.uuid4())
692
692
 
693
693
 
694
- def get_wl_band(radar_frequency: float) -> int:
695
- """Returns integer corresponding to radar frequency.
694
+ def get_wl_band(radar_frequency: float) -> Literal["X", "Ka", "W"]:
695
+ """Returns IEEE radar band corresponding to radar frequency.
696
696
 
697
697
  Args:
698
698
  radar_frequency: Radar frequency (GHz).
699
699
 
700
700
  Returns:
701
- 0 = 35GHz radar, 1 = 94Ghz radar.
701
+ IEEE radar band as string.
702
702
 
703
703
  """
704
- return 0 if (30 < radar_frequency < 40) else 1
705
-
706
-
707
- def get_frequency(wl_band: int) -> str:
708
- """Returns radar frequency string corresponding to wl band."""
709
- return "35.5" if wl_band == 0 else "94"
704
+ if 8 < radar_frequency < 12:
705
+ return "X"
706
+ if 27 < radar_frequency < 40:
707
+ return "Ka"
708
+ if 75 < radar_frequency < 110:
709
+ return "W"
710
+ msg = f"Unknown band: {radar_frequency} GHz"
711
+ raise ValueError(msg)
710
712
 
711
713
 
712
714
  def transpose(data: np.ndarray) -> np.ndarray:
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 66
3
- PATCH = 18
2
+ MINOR = 67
3
+ PATCH = 0
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.66.18
3
+ Version: 1.67.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -2,16 +2,16 @@ cloudnetpy/__init__.py,sha256=X_FqY-4yg5GUj5Edo14SToLEos6JIsC3fN-v1FUgQoA,43
2
2
  cloudnetpy/cli.py,sha256=lHkeAErmAijI-Ugpd4DHRHfbZP4SXOake0LIY5Ovv_Q,20782
3
3
  cloudnetpy/cloudnetarray.py,sha256=Ol1ha4RPAmFZANL__U5CaMKX4oYMXYR6OnjoCZ9w3eo,7077
4
4
  cloudnetpy/concat_lib.py,sha256=lLjEC0ILPI1ghv8Wu9WVDiQoAkwwBKlW5jV8KoIde_8,11963
5
- cloudnetpy/constants.py,sha256=RDB9aqpBRztk3QVCFgsmi9fwhtLuit_0WJrt0D6sDcc,736
5
+ cloudnetpy/constants.py,sha256=jjW1eO5BwmLjtCKXKGXtKF_BoKpvSNrRfpgW43fWT_0,824
6
6
  cloudnetpy/datasource.py,sha256=FcWS77jz56gIzwnbafDLdj-HjAyu0P_VtY7gkeVZThU,7952
7
7
  cloudnetpy/exceptions.py,sha256=ns48useL9RN3mPh7CqIiLA19VI9OmVbyRsKTkwbThF8,1760
8
8
  cloudnetpy/metadata.py,sha256=DOGt7EQLS-AVJEszrUrpXr3gHVQv655FzeCzKrOPvoU,5477
9
9
  cloudnetpy/output.py,sha256=lq4YSeMT_d-j4rlQkKm9KIZ8boupTBBBKV1eUawpmCI,15672
10
10
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- cloudnetpy/utils.py,sha256=JksYOwf9ORiR_QpoKrTe1JJwXpPYJj-wlwaZKCHoh3o,29744
12
- cloudnetpy/version.py,sha256=YdfbC1Is18-wsauv4KijktdV_lghueKCQgNzKMMazKo,73
11
+ cloudnetpy/utils.py,sha256=U0iMIKPiKLrLVAfs_u9pPuoWYW1RJHcM8dbLF9a4yIA,29796
12
+ cloudnetpy/version.py,sha256=9-gHFlbKlJNv6v3rFfs2bpwbFn9E2SIntv6AB3MKCTc,72
13
13
  cloudnetpy/categorize/__init__.py,sha256=s-SJaysvVpVVo5kidiruWQO6p3gv2TXwY1wEHYO5D6I,44
14
- cloudnetpy/categorize/atmos_utils.py,sha256=9-ymI6i1xASf-XAFyO87FaTfvq6bF89N1i_27OkUp-M,10104
14
+ cloudnetpy/categorize/atmos_utils.py,sha256=RcmbKxm2COkE7WEya0mK3yX5rzUbrewRVh3ekm01RtM,10598
15
15
  cloudnetpy/categorize/attenuation.py,sha256=Y_-fzmQTltWTqIZTulJhovC7a6ifpMcaAazDJcnMIOc,990
16
16
  cloudnetpy/categorize/categorize.py,sha256=HtttmUlnLE4Cw3QLdz-DRfRpd8sVr_Tp4A62XI67x24,20739
17
17
  cloudnetpy/categorize/classify.py,sha256=qovHgHsMku5kpl3cJxKteNBsG8GAkfI3Zo8QhJwZSFQ,8512
@@ -30,7 +30,7 @@ cloudnetpy/categorize/radar.py,sha256=0Wg5u2aLXRVhHiFiXb4fSqY_iGgSwcCMMVshM3wBoo
30
30
  cloudnetpy/categorize/attenuations/__init__.py,sha256=CWFHVWeTIe2hrZtgkJaX2HGftbuffsFc39Mzv5B0Lw0,1037
31
31
  cloudnetpy/categorize/attenuations/gas_attenuation.py,sha256=emr-RCxQT0i2N8k6eBNhRsmsCBPHJzQsWJfjC4fVSTo,975
32
32
  cloudnetpy/categorize/attenuations/liquid_attenuation.py,sha256=0p0G79BPkw1itCXHMwbvkNHtJGBocJzow3gNHAirChI,3036
33
- cloudnetpy/categorize/attenuations/melting_attenuation.py,sha256=-NDv8YZygqEsRHBs6RTkJ85Lu52o1Xo5ZUMI4cBoDbA,2334
33
+ cloudnetpy/categorize/attenuations/melting_attenuation.py,sha256=9c9xoZHtGUbjFYJxkVc3UUDHLDy0UbNUZ32ITtnsj5w,2333
34
34
  cloudnetpy/categorize/attenuations/rain_attenuation.py,sha256=qazJzRyXf9vbjJhh4yiFmABI4L57j5W_6YZ-6qjRiBI,2839
35
35
  cloudnetpy/instruments/__init__.py,sha256=_jejVwi_viSZehmAOkEqTNI-0-exGgAJ_bHW1IRRwTI,398
36
36
  cloudnetpy/instruments/basta.py,sha256=_OTnySd36ktvxk_swWBzbv_H4AVGlkF_Ce3KtPGD1rE,3758
@@ -38,13 +38,13 @@ cloudnetpy/instruments/campbell_scientific.py,sha256=2WHfBKQjtRSl0AqvtPeX7G8Hdi3
38
38
  cloudnetpy/instruments/ceilo.py,sha256=xrI7iYNftKvGZf-3C_ESUNsu-QhXV43iWkDuKp3biZU,9552
39
39
  cloudnetpy/instruments/ceilometer.py,sha256=pdmLVljsuciyKpaGxWxJ_f1IrJK-UrkBC0lSeuirLlU,12095
40
40
  cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoGGA,1990
41
- cloudnetpy/instruments/cloudnet_instrument.py,sha256=6qQSyQXHBTdOvzqTxOXtx6RYDm7vLVcwNYTx1nV_kM8,3885
41
+ cloudnetpy/instruments/cloudnet_instrument.py,sha256=NQZ_FMXh8iyzXYSCKQSpIdp0MZFAh7WqKE8mZRmVbF4,4164
42
42
  cloudnetpy/instruments/copernicus.py,sha256=nmgqGOjVQFngj7BNbpcuCwA-W3yksvBbqn__iq7MyDk,6469
43
43
  cloudnetpy/instruments/galileo.py,sha256=yQBedd7dmDnwuWi1MtXOsg4-RyRx0uRAXumCY4YuH9k,4686
44
44
  cloudnetpy/instruments/hatpro.py,sha256=DzCWzTJxTc5BSOgoeyM8RjYkSXX6NDi3QXgKRp0uxlI,8759
45
- cloudnetpy/instruments/instruments.py,sha256=jG5TYnZ8bdCZXnI303ZsaJBEdSKaIjKMbkGtnq6kQX0,3261
45
+ cloudnetpy/instruments/instruments.py,sha256=cHP0RN-Z8Jl9yoDHdvaOflTrzuogDTGmd-nxSOk8Uq4,3568
46
46
  cloudnetpy/instruments/lufft.py,sha256=ugXF6pssHAAz1Y_hqPdpKuluAjxxHSR88xBmQuS6RlI,3705
47
- cloudnetpy/instruments/mira.py,sha256=zfpPLCJLRc11wB-ddkQC9JALdwz73EgVbknv8iDJtuE,9847
47
+ cloudnetpy/instruments/mira.py,sha256=W8mAAc5tP4nxexiN4MhGEj4ZV2-Tz2AXp5Cpt4XPaN4,10119
48
48
  cloudnetpy/instruments/mrr.py,sha256=eeAzCp3CiHGauywjwvMUAFwZ4vBOZMcd3IlF8KsrLQo,5711
49
49
  cloudnetpy/instruments/nc_lidar.py,sha256=5gQG9PApnNPrHmS9_zanl8HEYIQuGRpbnzC3wfTcOyQ,1705
50
50
  cloudnetpy/instruments/nc_radar.py,sha256=PM4XQm2Ri9pLOh2mt9dphjdXr1_aPKMFWp2T_hDNo3c,6730
@@ -72,7 +72,7 @@ cloudnetpy/model_evaluation/products/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
72
72
  cloudnetpy/model_evaluation/products/advance_methods.py,sha256=rng3ZLR1Arv1AGUzq0Ehu-65628PC5LZVKpHSUpCIW8,8526
73
73
  cloudnetpy/model_evaluation/products/grid_methods.py,sha256=4no7mbKc9HlEXSNKPioqLmFZxUefuI-yqX0-Ej2jMzU,9067
74
74
  cloudnetpy/model_evaluation/products/model_products.py,sha256=uWi7zXQI7kR_ju0SL_BC1wozcq5DhaCcT-XZq33Q-bA,6861
75
- cloudnetpy/model_evaluation/products/observation_products.py,sha256=UJTb6-1Z-HOB9ltW8E7QHNEoByXeDQQUNi3GyS5lG_0,5500
75
+ cloudnetpy/model_evaluation/products/observation_products.py,sha256=-vUJi54qbgM3kbp0Im3BcW8RcB-aCw397XIaqfS_4vk,5496
76
76
  cloudnetpy/model_evaluation/products/product_resampling.py,sha256=IuWvtwpya76URh1WmTTgtLxAo4HZxkz6GmftpZkMCGo,3640
77
77
  cloudnetpy/model_evaluation/products/tools.py,sha256=lXnQ9XIEf5zqk_haY3mSrekPyGbAwNWvd6ZOol1Ip1Q,2918
78
78
  cloudnetpy/model_evaluation/statistics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -101,23 +101,23 @@ cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V
101
101
  cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
102
102
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
103
103
  cloudnetpy/plotting/plot_meta.py,sha256=d7CIT4ltUsjKw0HNnOXPkaLdZbkSmTuq6AbKdbODfZE,16730
104
- cloudnetpy/plotting/plotting.py,sha256=fyeOUS5Fd6t1V2Ud7aiDgCne4sNQMZrR1XLT-49SZb8,35524
104
+ cloudnetpy/plotting/plotting.py,sha256=E_UTnraLxYz8jEROOpQr0pFbntHpI8nL6gMcwgsyFj8,37109
105
105
  cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
106
106
  cloudnetpy/products/classification.py,sha256=KwAiBSgFwDqhM114NIgYiUjj8HoYc7gAlc8E1QgcSig,8207
107
107
  cloudnetpy/products/der.py,sha256=soypE7uSEP4uHUCCQVEhyXsKY6e9mzV9B_2S5GUizqk,12729
108
108
  cloudnetpy/products/drizzle.py,sha256=58C9Mo6oRXR8KpbVPghbJvHvFX9GfS3xUp058pbf0qw,10804
109
109
  cloudnetpy/products/drizzle_error.py,sha256=4GwlHRtNbk9ks7bGtXCco-wXbcDOKeAQwKmbhzut6Qk,6132
110
- cloudnetpy/products/drizzle_tools.py,sha256=SXD3GProk30NgRFIhvwLyeTEQ4PQPXFZ2RKgBR9WjbY,10870
111
- cloudnetpy/products/ier.py,sha256=yv5bTBtA1tOB-dAt71Gnou1ywvrnhZRhmWk84p3oJRA,6006
112
- cloudnetpy/products/iwc.py,sha256=_focccRSkgrS7wgKUY5ASfQ_PcmEZNQkvuvu3q9QA4o,9475
110
+ cloudnetpy/products/drizzle_tools.py,sha256=HLxUQ89mFNo6IIe6Cj3ZH-TPkJdpMxKCOt4cOOmcLs0,11002
111
+ cloudnetpy/products/ier.py,sha256=70jyYrhO-kAHuQ3CpDVcyKKuHT3c9Eby6ADHHlPjAFY,5986
112
+ cloudnetpy/products/iwc.py,sha256=FQtYFYnMNuDnjuK1ee3zOfzPtKsoWH95CXtEz1iplZI,9462
113
113
  cloudnetpy/products/lwc.py,sha256=sl6Al2tuH3KkCBrPbWTmuz3jlD5UQJ4D6qBsn1tt2CQ,18962
114
114
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
115
115
  cloudnetpy/products/mwr_tools.py,sha256=rd7UC67O4fsIE5SaHVZ4qWvUJTj41ZGwgQWPwZzOM14,5377
116
- cloudnetpy/products/product_tools.py,sha256=01Zc6xV8CSuYcIcLpchFf5POL3_c629-YMNDZJ51udA,10853
116
+ cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
117
117
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
118
- cloudnetpy-1.66.18.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
119
- cloudnetpy-1.66.18.dist-info/METADATA,sha256=WGYHjn8d1aUCtLC6Kj848evl1l5I0_vgZNF5bmWpbOc,5794
120
- cloudnetpy-1.66.18.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
121
- cloudnetpy-1.66.18.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
122
- cloudnetpy-1.66.18.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
123
- cloudnetpy-1.66.18.dist-info/RECORD,,
118
+ cloudnetpy-1.67.0.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
119
+ cloudnetpy-1.67.0.dist-info/METADATA,sha256=hslGwWAT2tUoak-gag54pZhHlz_1tS_huYydwN496RA,5793
120
+ cloudnetpy-1.67.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
121
+ cloudnetpy-1.67.0.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
122
+ cloudnetpy-1.67.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
123
+ cloudnetpy-1.67.0.dist-info/RECORD,,