cloudnetpy 1.66.19__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",
@@ -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
@@ -46,6 +47,7 @@ class PlotParameters:
46
47
  raise_on_empty: Whether to raise an error if no data is found for a
47
48
  plotted variable.
48
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.
49
51
 
50
52
  """
51
53
 
@@ -61,6 +63,7 @@ class PlotParameters:
61
63
  plot_meta: PlotMeta | None = None
62
64
  raise_on_empty: bool = False
63
65
  minor_ticks: bool = False
66
+ plot_above_ground: bool = False
64
67
 
65
68
 
66
69
  class Dimensions:
@@ -173,15 +176,35 @@ class FigureData:
173
176
  m2mm = 1e3
174
177
  file_type = getattr(self.file, "cloudnet_file_type", "")
175
178
  if file_type == "model":
176
- 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
177
184
  if "height" in self.file.variables:
178
- 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
179
192
  if "range" in self.file.variables:
180
193
  return self.file.variables["range"][:] * m2km
181
194
  if "diameter" in self.file.variables:
182
195
  return self.file.variables["diameter"][:] * m2mm
183
196
  return None
184
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
+
185
208
  def is_mwrpy_product(self) -> bool:
186
209
  cloudnet_file_type = getattr(self.file, "cloudnet_file_type", "")
187
210
  return cloudnet_file_type in ("mwr-single", "mwr-multi")
@@ -201,7 +224,8 @@ class SubPlot:
201
224
  self.ax = ax
202
225
  self.variable = variable
203
226
  self.options = options
204
- self.plot_meta = self._read_plot_meta(file_type)
227
+ self.file_type = file_type
228
+ self.plot_meta = self._read_plot_meta()
205
229
 
206
230
  def set_xax(self) -> None:
207
231
  resolution = 4
@@ -223,7 +247,11 @@ class SubPlot:
223
247
  ylabel: str | None = None,
224
248
  y_limits: tuple[float, float] | None = None,
225
249
  ) -> None:
226
- 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
227
255
  self.ax.set_ylabel(label, fontsize=13)
228
256
  if y_limits is not None:
229
257
  self.ax.set_ylim(*y_limits)
@@ -288,12 +316,12 @@ class SubPlot:
288
316
  va="bottom",
289
317
  )
290
318
 
291
- def _read_plot_meta(self, file_type: str | None) -> PlotMeta:
319
+ def _read_plot_meta(self) -> PlotMeta:
292
320
  if self.options.plot_meta is not None:
293
321
  plot_meta = self.options.plot_meta
294
322
  else:
295
323
  fallback = ATTRIBUTES["fallback"].get(self.variable.name, PlotMeta())
296
- file_attributes = ATTRIBUTES.get(file_type or "", {})
324
+ file_attributes = ATTRIBUTES.get(self.file_type or "", {})
297
325
  plot_meta = file_attributes.get(self.variable.name, fallback)
298
326
  if plot_meta.clabel is None:
299
327
  plot_meta = plot_meta._replace(clabel=_reformat_units(self.variable.units))
@@ -548,7 +576,7 @@ class Plot2D(Plot):
548
576
  self._plot_contour(
549
577
  figure_data,
550
578
  alt,
551
- levels=np.array([T0]),
579
+ levels=np.array([con.T0]),
552
580
  colors="gray",
553
581
  linewidths=1.25,
554
582
  linestyles="dashed",
@@ -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 = 19
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.19
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=LenpDgU7pkca-TTIRr09FikaXYR6wcpd58u4rgZjJdo,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=QPhaQ6Eh6gSuPWQ97Zk3gkCwzT57u3kBlk7-BcoR-jo,3413
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=KcvYCw2FaFeunAjaisbm-zxi1YFMiJeW8ni3J_yBuD4,35812
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.19.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
119
- cloudnetpy-1.66.19.dist-info/METADATA,sha256=5qIRCwOdmWKJeIztby_B29Qz68rRRr81WJoCnmPfDBk,5794
120
- cloudnetpy-1.66.19.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
121
- cloudnetpy-1.66.19.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
122
- cloudnetpy-1.66.19.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
123
- cloudnetpy-1.66.19.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,,