cloudnetpy 1.80.2__py3-none-any.whl → 1.80.4__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.
@@ -29,6 +29,7 @@ def calc_melting_attenuation(
29
29
  )
30
30
 
31
31
  rainfall_rate = data.disdrometer.data["rainfall_rate"][:]
32
+ rainfall_rate[is_rain == 0] = ma.masked
32
33
  frequency = data.radar.radar_frequency
33
34
 
34
35
  attenuation_array = _calc_melting_attenuation(rainfall_rate, frequency)
@@ -240,7 +240,7 @@ def _save_cat(
240
240
  extra=extra_references,
241
241
  )
242
242
  if is_voodoo:
243
- import voodoonet.version
243
+ import voodoonet.version # noqa: PLC0415
244
244
 
245
245
  nc.voodoonet_version = voodoonet.version.__version__
246
246
  output.add_source_instruments(nc, data_obs)
@@ -325,8 +325,7 @@ COMMENTS = {
325
325
  "have\n a reflectivity of 0 dBZ at all frequencies."
326
326
  ),
327
327
  "bias": (
328
- "This variable is an estimate of the one-standard-deviation\n"
329
- "calibration error."
328
+ "This variable is an estimate of the one-standard-deviation\ncalibration error."
330
329
  ),
331
330
  "insect_prob": (
332
331
  "Ad-hoc estimation of the probability that the pixel contains insects."
@@ -64,10 +64,9 @@ def classify_measurements(data: Observations) -> ClassificationResult:
64
64
  if "rpg-fmcw-94" not in obs.radar_type.lower():
65
65
  msg = "VoodooNet is only implemented for RPG-FMCW-94 radar."
66
66
  raise NotImplementedError(msg)
67
- import voodoonet
68
- from voodoonet.utils import VoodooOptions
67
+ import voodoonet # noqa: PLC0415
69
68
 
70
- options = VoodooOptions(progress_bar=False)
69
+ options = voodoonet.VoodooOptions(progress_bar=False)
71
70
  target_time = voodoonet.utils.decimal_hour2unix(obs.date, obs.time)
72
71
  liquid_prob = voodoonet.infer(
73
72
  obs.lv0_files, target_time=target_time, options=options
@@ -151,7 +151,7 @@ def _find_melting_layer_from_v(
151
151
  v_prof[base] < -2,
152
152
  ]
153
153
  if all(conditions):
154
- base = int(round(top - (top - base) / 2))
154
+ base = round(top - (top - base) / 2)
155
155
  return np.arange(base, top)
156
156
  return None
157
157
 
@@ -45,6 +45,6 @@ class Mwr(DataSource):
45
45
  self.data["lwp_error"].comment = (
46
46
  "This variable is a rough estimate of the one-standard-deviation\n"
47
47
  f"error in liquid water path, calculated as a combination of\n"
48
- f"a {bias} g m-2 linear error and a {round(random_error*100)} %\n"
48
+ f"a {bias} g m-2 linear error and a {round(random_error * 100)} %\n"
49
49
  "fractional error."
50
50
  )
cloudnetpy/cli.py CHANGED
@@ -519,7 +519,7 @@ def _process_mwrpy_product(
519
519
  filename = f"{args.date}_{args.site}_{product}.nc"
520
520
  output_file = _create_output_folder("geophysical", args) / filename
521
521
  module = importlib.import_module("cloudnetpy.products")
522
- getattr(module, f"generate_{product.replace('-','_')}")(mwr_l1c_file, output_file)
522
+ getattr(module, f"generate_{product.replace('-', '_')}")(mwr_l1c_file, output_file)
523
523
  logging.info("Processed %s: %s", product, output_file)
524
524
  return str(output_file)
525
525
 
@@ -107,9 +107,9 @@ class FD12P(CSVFile):
107
107
  logging.info("Skipped %d lines", invalid_lines)
108
108
  for key in ("visibility", "synop_WaWa", "snowfall_amount"):
109
109
  values = np.array(
110
- [0 if x is math.nan else x for x in self._data[key]], dtype=np.int32
110
+ [0 if math.isnan(x) else x for x in self._data[key]], dtype=np.int32
111
111
  )
112
- mask = np.array([x is math.nan for x in self._data[key]])
112
+ mask = np.array([math.isnan(x) for x in self._data[key]])
113
113
  self._data[key] = ma.array(values, mask=mask)
114
114
  self._data["snowfall_amount"] = self._data["snowfall_amount"].astype(np.float32)
115
115
  if expected_date:
@@ -11,6 +11,7 @@ from pathlib import Path
11
11
  from typing import Any, NamedTuple
12
12
 
13
13
  import numpy as np
14
+ from numpy import ma
14
15
 
15
16
  from cloudnetpy import output, utils
16
17
  from cloudnetpy.cloudnetarray import CloudnetArray
@@ -151,6 +152,15 @@ class RadiometricsMP:
151
152
  ah_times = []
152
153
  block_titles = {}
153
154
  skip_procs = set()
155
+
156
+ def _parse_floats() -> list[float]:
157
+ return [
158
+ float(record.values[column])
159
+ if record.values[column].replace(".", "", 1).isdigit()
160
+ else math.nan
161
+ for column in self.ranges
162
+ ]
163
+
154
164
  for record in self.raw_data:
155
165
  if record.block_type == 100:
156
166
  block_type = int(record.values["Record Type"]) - 1
@@ -165,15 +175,13 @@ class RadiometricsMP:
165
175
  continue
166
176
  if title == "Temperature (K)":
167
177
  temp_times.append(record.timestamp)
168
- temps.append(
169
- [float(record.values[column]) for column in self.ranges]
170
- )
178
+ temps.append(_parse_floats())
171
179
  elif title == "Relative Humidity (%)":
172
180
  rh_times.append(record.timestamp)
173
- rhs.append([float(record.values[column]) for column in self.ranges])
181
+ rhs.append(_parse_floats())
174
182
  elif title == "Vapor Density (g/m^3)":
175
183
  ah_times.append(record.timestamp)
176
- ahs.append([float(record.values[column]) for column in self.ranges])
184
+ ahs.append(_parse_floats())
177
185
  elif record.block_type == 10:
178
186
  if record.block_index == 0:
179
187
  lwp = record.values["Lqint(mm)"]
@@ -185,15 +193,13 @@ class RadiometricsMP:
185
193
  irt_times.append(record.timestamp)
186
194
  irts.append([float(irt)])
187
195
  temp_times.append(record.timestamp)
188
- temps.append(
189
- [float(record.values[column]) for column in self.ranges]
190
- )
196
+ temps.append(_parse_floats())
191
197
  elif record.block_index == 1:
192
198
  ah_times.append(record.timestamp)
193
- ahs.append([float(record.values[column]) for column in self.ranges])
199
+ ahs.append(_parse_floats())
194
200
  elif record.block_index == 2:
195
201
  rh_times.append(record.timestamp)
196
- rhs.append([float(record.values[column]) for column in self.ranges])
202
+ rhs.append(_parse_floats())
197
203
  elif record.block_type == 200:
198
204
  irt_times.append(record.timestamp)
199
205
  irt = record.values["Tir(K)"]
@@ -350,7 +356,8 @@ class RadiometricsCombined:
350
356
  if key in ("temperature", "relative_humidity", "absolute_humidity")
351
357
  else None
352
358
  )
353
- self.data[key] = CloudnetArray(array, key, dimensions=dimensions)
359
+ array_masked = ma.masked_invalid(array) if np.isnan(array).any() else array
360
+ self.data[key] = CloudnetArray(array_masked, key, dimensions=dimensions)
354
361
 
355
362
  def add_meta(self) -> None:
356
363
  """Adds some metadata."""
@@ -156,10 +156,8 @@ def _mask_invalid_data(data_in: dict) -> dict:
156
156
  fill_values = (-999, 1e-10)
157
157
  extra_keys = ("air_temperature", "air_pressure")
158
158
  for name in data:
159
- if (
160
- np.issubdtype(data[name].dtype, np.integer)
161
- or data[name].ndim < 2
162
- and name not in extra_keys
159
+ if np.issubdtype(data[name].dtype, np.integer) or (
160
+ data[name].ndim < 2 and name not in extra_keys
163
161
  ):
164
162
  continue
165
163
  data[name] = ma.masked_equal(data[name], 0)
@@ -242,7 +242,7 @@ class HatproBinLwp(HatproBin):
242
242
  elif self.header["file_code"] == 934501000:
243
243
  self.version = 2
244
244
  else:
245
- msg = f'Unknown HATPRO version. {self.header["file_code"]}'
245
+ msg = f"Unknown HATPRO version. {self.header['file_code']}"
246
246
  raise ValueError(msg)
247
247
 
248
248
  def _read_data(self, file) -> None:
@@ -281,7 +281,7 @@ class HatproBinIwv(HatproBin):
281
281
  elif self.header["file_code"] == 594811000:
282
282
  self.version = 2
283
283
  else:
284
- msg = f'Unknown HATPRO version. {self.header["file_code"]}'
284
+ msg = f"Unknown HATPRO version. {self.header['file_code']}"
285
285
  raise ValueError(msg)
286
286
 
287
287
  def _read_data(self, file) -> None:
@@ -3,7 +3,7 @@ import datetime
3
3
  import math
4
4
  import re
5
5
  from collections import defaultdict
6
- from collections.abc import Iterable
6
+ from collections.abc import Iterable, Sequence
7
7
  from os import PathLike
8
8
 
9
9
  import numpy as np
@@ -21,11 +21,11 @@ from cloudnetpy.utils import datetime2decimal_hours
21
21
 
22
22
 
23
23
  def ws2nc(
24
- weather_station_file: str | list[str],
24
+ weather_station_file: str | PathLike | Sequence[str | PathLike],
25
25
  output_file: str,
26
26
  site_meta: dict,
27
27
  uuid: str | None = None,
28
- date: str | None = None,
28
+ date: str | datetime.date | None = None,
29
29
  ) -> str:
30
30
  """Converts weather station data into Cloudnet Level 1b netCDF file.
31
31
 
@@ -43,8 +43,10 @@ def ws2nc(
43
43
  Raises:
44
44
  ValidTimeStampError: No valid timestamps found.
45
45
  """
46
- if not isinstance(weather_station_file, list):
46
+ if isinstance(weather_station_file, str | PathLike):
47
47
  weather_station_file = [weather_station_file]
48
+ if isinstance(date, str):
49
+ date = datetime.date.fromisoformat(date)
48
50
  ws: WS
49
51
  if site_meta["name"] == "Palaiseau":
50
52
  ws = PalaiseauWS(weather_station_file, site_meta)
@@ -64,6 +66,8 @@ def ws2nc(
64
66
  ws = LampedusaWS(weather_station_file, site_meta)
65
67
  elif site_meta["name"] == "Limassol":
66
68
  ws = LimassolWS(weather_station_file, site_meta)
69
+ elif site_meta["name"] == "L'Aquila":
70
+ ws = LAquilaWS(weather_station_file, site_meta)
67
71
  else:
68
72
  msg = "Unsupported site"
69
73
  raise ValueError(msg)
@@ -98,8 +102,8 @@ class WS(CSVFile):
98
102
  rainfall_amount = ma.cumsum(self.data["rainfall_rate"].data * resolution)
99
103
  self.data["rainfall_amount"] = CloudnetArray(rainfall_amount, "rainfall_amount")
100
104
 
101
- def screen_timestamps(self, date: str) -> None:
102
- dates = np.array([str(d.date()) for d in self._data["time"]])
105
+ def screen_timestamps(self, date: datetime.date) -> None:
106
+ dates = np.array([d.date() for d in self._data["time"]])
103
107
  valid_mask = dates == date
104
108
  if not valid_mask.any():
105
109
  raise ValidTimeStampError
@@ -139,7 +143,7 @@ class WS(CSVFile):
139
143
 
140
144
 
141
145
  class PalaiseauWS(WS):
142
- def __init__(self, filenames: list[str], site_meta: dict):
146
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
143
147
  super().__init__(site_meta)
144
148
  self.filenames = filenames
145
149
  self._data = self._read_data()
@@ -170,8 +174,8 @@ class PalaiseauWS(WS):
170
174
  decimal_hours = datetime2decimal_hours(self._data["time"])
171
175
  self.data["time"] = CloudnetArray(decimal_hours, "time")
172
176
 
173
- def screen_timestamps(self, date: str) -> None:
174
- dates = [str(d.date()) for d in self._data["time"]]
177
+ def screen_timestamps(self, date: datetime.date) -> None:
178
+ dates = [d.date() for d in self._data["time"]]
175
179
  valid_ind = [ind for ind, d in enumerate(dates) if d == date]
176
180
  if not valid_ind:
177
181
  raise ValidTimeStampError
@@ -228,7 +232,7 @@ class BucharestWS(PalaiseauWS):
228
232
 
229
233
 
230
234
  class GranadaWS(WS):
231
- def __init__(self, filenames: list[str], site_meta: dict):
235
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
232
236
  if len(filenames) != 1:
233
237
  raise ValueError
234
238
  super().__init__(site_meta)
@@ -278,7 +282,7 @@ class GranadaWS(WS):
278
282
 
279
283
 
280
284
  class KenttarovaWS(WS):
281
- def __init__(self, filenames: list[str], site_meta: dict):
285
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
282
286
  super().__init__(site_meta)
283
287
  self.filenames = filenames
284
288
  self._data = self._read_data()
@@ -334,7 +338,7 @@ class HyytialaWS(WS):
334
338
  - BbRT/mm = Bucket content in real-time (Pluvio200) [mm].
335
339
  """
336
340
 
337
- def __init__(self, filenames: list[str], site_meta: dict):
341
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
338
342
  super().__init__(site_meta)
339
343
  self.filename = filenames[0]
340
344
  self._data = self._read_data()
@@ -395,7 +399,7 @@ class HyytialaWS(WS):
395
399
 
396
400
 
397
401
  class GalatiWS(WS):
398
- def __init__(self, filenames: list[str], site_meta: dict):
402
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
399
403
  super().__init__(site_meta)
400
404
  self.filename = filenames[0]
401
405
  self._data = self._read_data()
@@ -450,7 +454,7 @@ class GalatiWS(WS):
450
454
 
451
455
 
452
456
  class JuelichWS(WS):
453
- def __init__(self, filenames: list[str], site_meta: dict):
457
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
454
458
  super().__init__(site_meta)
455
459
  self.filename = filenames[0]
456
460
  self._data = self._read_data()
@@ -496,7 +500,7 @@ class JuelichWS(WS):
496
500
  class LampedusaWS(WS):
497
501
  """Read Lampedusa weather station data in ICOS format."""
498
502
 
499
- def __init__(self, filenames: list[str], site_meta: dict):
503
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
500
504
  super().__init__(site_meta)
501
505
  self.filename = filenames[0]
502
506
  self._data = self._read_data()
@@ -549,7 +553,7 @@ class LampedusaWS(WS):
549
553
 
550
554
 
551
555
  class LimassolWS(WS):
552
- def __init__(self, filenames: list[str], site_meta: dict):
556
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
553
557
  super().__init__(site_meta)
554
558
  self.filenames = filenames
555
559
  self._data = defaultdict(list)
@@ -562,8 +566,8 @@ class LimassolWS(WS):
562
566
  decimal_hours = datetime2decimal_hours(self._data["time"])
563
567
  self.data["time"] = CloudnetArray(decimal_hours, "time")
564
568
 
565
- def screen_timestamps(self, date: str) -> None:
566
- dates = [str(d.date()) for d in self._data["time"]]
569
+ def screen_timestamps(self, date: datetime.date) -> None:
570
+ dates = [d.date() for d in self._data["time"]]
567
571
  valid_ind = [ind for ind, d in enumerate(dates) if d == date]
568
572
  if not valid_ind:
569
573
  raise ValidTimeStampError
@@ -622,7 +626,7 @@ def _parse_sirta(filename: str | PathLike):
622
626
  if m is None:
623
627
  continue
624
628
  if m[1] != str(len(columns) + 1):
625
- msg = f"Expected column {m[1]}, found {len(columns)+1}"
629
+ msg = f"Expected column {m[1]}, found {len(columns) + 1}"
626
630
  raise ValueError(msg)
627
631
  columns.append(m[2])
628
632
  output[m[2]] = []
@@ -646,3 +650,51 @@ def _parse_sirta(filename: str | PathLike):
646
650
  parsed = float(value)
647
651
  output[column].append(parsed)
648
652
  return output
653
+
654
+
655
+ class LAquilaWS(WS):
656
+ def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict):
657
+ super().__init__(site_meta)
658
+ self.filenames = filenames
659
+ self._data = self._read_data()
660
+
661
+ def _read_data(self) -> dict:
662
+ data: dict[str, list] = {
663
+ key: []
664
+ for key in [
665
+ "time",
666
+ "air_temperature",
667
+ "air_pressure",
668
+ "relative_humidity",
669
+ "rainfall_rate",
670
+ "wind_speed",
671
+ "wind_direction",
672
+ ]
673
+ }
674
+ for filename in self.filenames:
675
+ with open(filename) as f:
676
+ for row in f:
677
+ if row.startswith("#"):
678
+ continue
679
+ columns = row.split(",")
680
+ if len(columns) != 7:
681
+ continue
682
+ timestamp = datetime.datetime.strptime(
683
+ columns[0], "%Y-%m-%dT%H:%M:%SZ"
684
+ ).replace(tzinfo=datetime.timezone.utc)
685
+ data["time"].append(timestamp)
686
+ data["air_temperature"].append(self._parse_value(columns[1]))
687
+ data["air_pressure"].append(self._parse_value(columns[2]))
688
+ data["relative_humidity"].append(self._parse_value(columns[3]))
689
+ data["rainfall_rate"].append(self._parse_value(columns[4]))
690
+ data["wind_speed"].append(self._parse_value(columns[5]))
691
+ data["wind_direction"].append(self._parse_value(columns[6]))
692
+ output = self.format_data(data)
693
+ _, time_ind = np.unique(output["time"], return_index=True)
694
+ for key in output:
695
+ output[key] = output[key][time_ind]
696
+ return output
697
+
698
+ def _parse_value(self, value: str) -> float:
699
+ value = value.strip()
700
+ return float(value) if value else math.nan
@@ -14,10 +14,7 @@ def parse_wanted_names(
14
14
  advance: bool = False,
15
15
  ) -> tuple[list, list]:
16
16
  """Returns standard and advection lists of product types to plot."""
17
- if variables:
18
- names = variables
19
- else:
20
- names = parse_dataset_keys(nc_file, name, advance=advance, model=model)
17
+ names = variables or parse_dataset_keys(nc_file, name, advance=advance, model=model)
21
18
  standard_n = [n for n in names if name in n and "adv" not in n]
22
19
  standard_n = sort_model2first_element(standard_n, model)
23
20
  advection_n = [n for n in names if name in n and "adv" in n]
@@ -100,10 +100,10 @@ class Dimensions:
100
100
  .translated(-tightbbox.x0, -tightbbox.y0)
101
101
  .extents
102
102
  )
103
- self.margin_top = int(self.height - round(y1))
104
- self.margin_right = int(self.width - round(x1) - 1)
105
- self.margin_bottom = int(round(y0) - 1)
106
- self.margin_left = int(round(x0))
103
+ self.margin_top = self.height - round(y1)
104
+ self.margin_right = self.width - round(x1) - 1
105
+ self.margin_bottom = round(y0) - 1
106
+ self.margin_left = round(x0)
107
107
 
108
108
 
109
109
  class FigureData:
@@ -174,7 +174,7 @@ def _infer_pulse_repetition_frequency(range_: npt.NDArray[np.float64]):
174
174
  return 15e3
175
175
  if round_trip_time / T_LOW < 1:
176
176
  return 10e3
177
- msg = f"Suspiciously large range ({dist}m). " "Cannot infer pulse repetition rate"
177
+ msg = f"Suspiciously large range ({dist}m). Cannot infer pulse repetition rate"
178
178
  raise ValueError(msg)
179
179
 
180
180
 
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 80
3
- PATCH = 2
3
+ PATCH = 4
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.80.2
3
+ Version: 1.80.4
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -1,5 +1,5 @@
1
1
  cloudnetpy/__init__.py,sha256=X_FqY-4yg5GUj5Edo14SToLEos6JIsC3fN-v1FUgQoA,43
2
- cloudnetpy/cli.py,sha256=lHkeAErmAijI-Ugpd4DHRHfbZP4SXOake0LIY5Ovv_Q,20782
2
+ cloudnetpy/cli.py,sha256=_jR8dqOFb8b7iuNbOgQAEn7KXBIABAImoBa1UR5yQ64,20783
3
3
  cloudnetpy/cloudnetarray.py,sha256=uOYgpQ8hHh5fuHyip1HjnhsEda9_7dg7orYnbCRkTtI,4796
4
4
  cloudnetpy/concat_lib.py,sha256=XQ5Sk8kfXqI0Q5HoomKWWhdZ1-m2thYDKGL7SKapITE,12851
5
5
  cloudnetpy/constants.py,sha256=YnoSzZm35NDooJfhlulSJBc7g0eSchT3yGytRaTaJEI,845
@@ -9,12 +9,12 @@ cloudnetpy/metadata.py,sha256=lO7BCbVAzFoH3Nq-VuezYX0f7MnbG1Zp11g5GSiuQwM,6189
9
9
  cloudnetpy/output.py,sha256=gupxt4f_-eUrFsWMto8tnknoV-p9QauC9L6CJAqBILU,15988
10
10
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  cloudnetpy/utils.py,sha256=WczDeGN408XSgGeaRLXFmlLjgAS67lK1osV0YEuKmwo,32027
12
- cloudnetpy/version.py,sha256=7zXWRL5tx8CR6R5neJyk3PXzFjoph6dombYnU9CqKUI,72
12
+ cloudnetpy/version.py,sha256=gRypIp5VxKqJm4PnzMffyk97bW_iTJT5wmm6cIcVuW0,72
13
13
  cloudnetpy/categorize/__init__.py,sha256=s-SJaysvVpVVo5kidiruWQO6p3gv2TXwY1wEHYO5D6I,44
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=RcmbKxm2COkE7WEya0mK3yX5rzUbrewRVh3ekm01RtM,10598
15
15
  cloudnetpy/categorize/attenuation.py,sha256=Y_-fzmQTltWTqIZTulJhovC7a6ifpMcaAazDJcnMIOc,990
16
- cloudnetpy/categorize/categorize.py,sha256=E3WAG79UGRLsDK3ZfaRfk7Vedht4OMxSgjHOPVBqrS4,20824
17
- cloudnetpy/categorize/classify.py,sha256=qovHgHsMku5kpl3cJxKteNBsG8GAkfI3Zo8QhJwZSFQ,8512
16
+ cloudnetpy/categorize/categorize.py,sha256=Q7FOZ63SJI6lXK56PsTASSbu2fd-6O8J5yfTfuZDKIU,20830
17
+ cloudnetpy/categorize/classify.py,sha256=Wka2DyyvXTQCUN2vQv13l4Y8azcE8ABKEL5_5fHRUkk,8489
18
18
  cloudnetpy/categorize/containers.py,sha256=9nAmI1OnR_uANyTZS1cD4do6NrC90EqliEMVrFnQY24,5398
19
19
  cloudnetpy/categorize/disdrometer.py,sha256=sRSt2B932lrrkvycKoSaKEIaDVfq9Z7uU-4iHRr-fC0,1893
20
20
  cloudnetpy/categorize/droplet.py,sha256=t49KEsH5ZM68JQ4NvAf9kGgQ-evic1T4de2-jgJ2f4M,8683
@@ -23,14 +23,14 @@ cloudnetpy/categorize/freezing.py,sha256=eSFD37R7vBrg7mgfSanrwhBjnFyWNBpjw2AtvRm
23
23
  cloudnetpy/categorize/insects.py,sha256=MrxlWK-5JaMZxCBWFKR_6Kj5TAVXm-s9SVxsvcyNYJo,5253
24
24
  cloudnetpy/categorize/itu.py,sha256=ffXK27guyRS4d66VWQ2h4UEGjUIhGjPKbFmj7kh698c,10304
25
25
  cloudnetpy/categorize/lidar.py,sha256=YQrM_LOz8NQrrD9l9HyujV1GSGwkQ8LMqXN13bEJRW4,2605
26
- cloudnetpy/categorize/melting.py,sha256=ZnLeL_qWmiCdjXVOm9iBYHdo29Brqxu_DEErZPqUloQ,6217
26
+ cloudnetpy/categorize/melting.py,sha256=TUoy-nj-BRwEpwZZHEpLH5Mg9gONWWwTKFTiLXNnEmE,6212
27
27
  cloudnetpy/categorize/model.py,sha256=QFRCY0TvM2fzGRyP8BNkqbvu13XcQjt7TsN5fhjI_Uc,6654
28
- cloudnetpy/categorize/mwr.py,sha256=F7cquERWL6mBkgboqeaCIPf9gOlKI-NWUQIBdQXGT_I,1635
28
+ cloudnetpy/categorize/mwr.py,sha256=YZNbufeVKQBdXJHokD4dGwWdjQICwdHtRVs5EVj1LHs,1637
29
29
  cloudnetpy/categorize/radar.py,sha256=Bc-JkMpU3_wFBo7eMMtlF5oiyTaIwbs_BsAn4dufTsE,15953
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=9c9xoZHtGUbjFYJxkVc3UUDHLDy0UbNUZ32ITtnsj5w,2333
33
+ cloudnetpy/categorize/attenuations/melting_attenuation.py,sha256=itggcm-wtyRe0qOM2wQKE4jOl2wKOq1NQjhsDOxxKgc,2377
34
34
  cloudnetpy/categorize/attenuations/rain_attenuation.py,sha256=qazJzRyXf9vbjJhh4yiFmABI4L57j5W_6YZ-6qjRiBI,2839
35
35
  cloudnetpy/instruments/__init__.py,sha256=PEgrrQNoiOuN_ctYilmt4LV2QCLg1likPjJdWtuGlLs,528
36
36
  cloudnetpy/instruments/basta.py,sha256=Lb_EhQTI93S5Bd9osDbCE_tC8gZreRsHz7D2_dFOjmE,3793
@@ -40,7 +40,7 @@ cloudnetpy/instruments/ceilometer.py,sha256=8DzOUC7PUZYLfCC9t9LA5YSsF78xs4B4VjBL
40
40
  cloudnetpy/instruments/cl61d.py,sha256=0QMqXHIy0hn2mksAwTdaKMOaEWjsZmj7QZ8hCbcHwxE,2225
41
41
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=SGPsRYYoGPoRoDY7hHJcKUVX0A23X0Telc00Fu01PnY,4495
42
42
  cloudnetpy/instruments/copernicus.py,sha256=hCphEKyFCc3f1uLRdjL2435kuh64M5q-V1bI68bzGbA,6528
43
- cloudnetpy/instruments/fd12p.py,sha256=aGYpkczdSl7FSmK1bByMnpUBD5GAl7RTKkopt0cpWas,6822
43
+ cloudnetpy/instruments/fd12p.py,sha256=l5WVCKy2DZ6fUBQBaBKoRHvrmJrbRUqR0I9ggtJJ72Y,6822
44
44
  cloudnetpy/instruments/galileo.py,sha256=vcY7mYcGD8YtMw8ioy9CNGu5yarQlwE-vfWIRSbTQG0,4745
45
45
  cloudnetpy/instruments/hatpro.py,sha256=G1fHsY9LTos4vHP5kFubjE5Wg2uTVFZpYDSD8VAo-zw,9590
46
46
  cloudnetpy/instruments/instruments.py,sha256=z8Osjww3iQRxKvzXdISl-5vV6gShtji8Db5k-ZzDQ-0,4843
@@ -50,13 +50,13 @@ cloudnetpy/instruments/mrr.py,sha256=eeAzCp3CiHGauywjwvMUAFwZ4vBOZMcd3IlF8KsrLQo
50
50
  cloudnetpy/instruments/nc_lidar.py,sha256=5gQG9PApnNPrHmS9_zanl8HEYIQuGRpbnzC3wfTcOyQ,1705
51
51
  cloudnetpy/instruments/nc_radar.py,sha256=HlaZeH5939R86ukF8K-P4Kfzb5-CpLB15LU2u94C5eI,7330
52
52
  cloudnetpy/instruments/pollyxt.py,sha256=U3g-ttmcs02LuLwVOydP3GjeNcmDyoYQroB-leIGdHY,10060
53
- cloudnetpy/instruments/radiometrics.py,sha256=H-tAyCCT53GjODQuDxIx8NFuZazm8BNPt5gHEuxjRxg,15570
53
+ cloudnetpy/instruments/radiometrics.py,sha256=qCiBTlp1H30DZTxKDN5Xn_4d-JkTNavpVIiUvpJkiMM,15617
54
54
  cloudnetpy/instruments/rain_e_h3.py,sha256=JEg4Ko7ZdfjAUJwJ1BWdTkm4K7r3s8WKrPb-HidTqpg,5336
55
- cloudnetpy/instruments/rpg.py,sha256=m3-xLJ-w2T7Ip7jBveWsGrts4tmNvdc-Lb4HebvHQjQ,17319
56
- cloudnetpy/instruments/rpg_reader.py,sha256=ThztFuVrWxhmWVAfZTfQDeUiKK1XMTbtv08IBe8GK98,11364
55
+ cloudnetpy/instruments/rpg.py,sha256=ynt1XrXWr2cRA4s9lO2m83WUhUD7nmseUwUTDf4HrXU,17295
56
+ cloudnetpy/instruments/rpg_reader.py,sha256=3SEm3xlzSlmuAolj8khnDVMWeUJap84OZcwN3tBobuo,11364
57
57
  cloudnetpy/instruments/toa5.py,sha256=CfmmBMv5iMGaWHIGBK01Rw24cuXC1R1RMNTXkmsm340,1760
58
58
  cloudnetpy/instruments/vaisala.py,sha256=W_yu_f92cOq8RiiqDLj7bswxu9UMS3TITPWzP5xPdvA,4615
59
- cloudnetpy/instruments/weather_station.py,sha256=pZK7I5bk1USDRoTeIhZoWzbka9ciea5ypA3oIzZX-7g,24549
59
+ cloudnetpy/instruments/weather_station.py,sha256=K3uT4dphgHKxsR3fpfwq57b3CrUwp9A4DdW5_qAunmg,26846
60
60
  cloudnetpy/instruments/disdrometer/__init__.py,sha256=lyjwttWvFvuwYxEkusoAvgRcbBmglmOp5HJOpXUqLWo,93
61
61
  cloudnetpy/instruments/disdrometer/common.py,sha256=g52iK2aNp3Z88kovUmGVpC54NZomPa9D871gzO0AmQ4,9267
62
62
  cloudnetpy/instruments/disdrometer/parsivel.py,sha256=HJZrEysQkx9MiIVPDV25CYHpXi_SjgZlgO-otoaKK34,25640
@@ -68,7 +68,7 @@ cloudnetpy/model_evaluation/model_metadata.py,sha256=CxpY6RPm7GOTBBmPhcNVVpm9ate
68
68
  cloudnetpy/model_evaluation/utils.py,sha256=Z9VqYVdtY9yTr2JeVfBn4nccIVWCN5Fd-BCyB_qYI-A,154
69
69
  cloudnetpy/model_evaluation/plotting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
70
  cloudnetpy/model_evaluation/plotting/plot_meta.py,sha256=K18Ugohh24uVAIxjZgJsmK80YwsMstm6B7ptVafONAw,3557
71
- cloudnetpy/model_evaluation/plotting/plot_tools.py,sha256=umI06tPIEs48cQ8GY8s3vGHwPcN--tUir4s1yxNQf64,5043
71
+ cloudnetpy/model_evaluation/plotting/plot_tools.py,sha256=QWHo_iO53676u9z6cnGV190UAfS2ojmCZqWmbRThkT0,4998
72
72
  cloudnetpy/model_evaluation/plotting/plotting.py,sha256=mGgSnQoRTh04v5RSJHsYPaqUEIR82eZqAuiszrh9rjY,31235
73
73
  cloudnetpy/model_evaluation/products/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
74
  cloudnetpy/model_evaluation/products/advance_methods.py,sha256=rng3ZLR1Arv1AGUzq0Ehu-65628PC5LZVKpHSUpCIW8,8526
@@ -103,24 +103,24 @@ cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V
103
103
  cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
104
104
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
105
105
  cloudnetpy/plotting/plot_meta.py,sha256=qfyZJNis937uM-NJseer8i4FO7I_v5jhQPyFl5Uszi8,17390
106
- cloudnetpy/plotting/plotting.py,sha256=nMdrXg7WEUUAHFQ0-_kxlETuXYd17-mzYNXbbsE0nVU,38607
106
+ cloudnetpy/plotting/plotting.py,sha256=3YjdqhTWhIHOwX9FhGJ-hlXH32BGSn2j7bgOfRu_Kt4,38587
107
107
  cloudnetpy/products/__init__.py,sha256=cBJdJBYltz5ZTKDqnRo-0StytAZK8gE3RYxxriFA4ak,295
108
108
  cloudnetpy/products/classification.py,sha256=KwAiBSgFwDqhM114NIgYiUjj8HoYc7gAlc8E1QgcSig,8207
109
109
  cloudnetpy/products/der.py,sha256=soypE7uSEP4uHUCCQVEhyXsKY6e9mzV9B_2S5GUizqk,12729
110
110
  cloudnetpy/products/drizzle.py,sha256=58C9Mo6oRXR8KpbVPghbJvHvFX9GfS3xUp058pbf0qw,10804
111
111
  cloudnetpy/products/drizzle_error.py,sha256=4GwlHRtNbk9ks7bGtXCco-wXbcDOKeAQwKmbhzut6Qk,6132
112
112
  cloudnetpy/products/drizzle_tools.py,sha256=HLxUQ89mFNo6IIe6Cj3ZH-TPkJdpMxKCOt4cOOmcLs0,11002
113
- cloudnetpy/products/epsilon.py,sha256=sVtOcl-tckvZCmM34etRQCzLg5NjvbHlt_5InRCjm1E,7734
113
+ cloudnetpy/products/epsilon.py,sha256=3_WAu3upbGh7JgL-QcSPii-jVhRjUewkIdugozqXPHk,7731
114
114
  cloudnetpy/products/ier.py,sha256=XW4gg_H-JWMWKToMqLVl6v8kx1S65GBwclWDCn1EfSk,5991
115
115
  cloudnetpy/products/iwc.py,sha256=WcPdAZx3zW0zaNJNp2vpAD4JnG0NJjFmCUAhDWzNxMg,9459
116
116
  cloudnetpy/products/lwc.py,sha256=sl6Al2tuH3KkCBrPbWTmuz3jlD5UQJ4D6qBsn1tt2CQ,18962
117
117
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
118
118
  cloudnetpy/products/mwr_tools.py,sha256=8HPZpQMTojKZP1JS1S83IE0sxmbDE9bxlaWoqmGnUZE,6199
119
119
  cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
120
- cloudnetpy-1.80.2.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
120
+ cloudnetpy-1.80.4.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
121
121
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
122
- cloudnetpy-1.80.2.dist-info/METADATA,sha256=coxvAU-k7KsWoNiet_mhP3Y5NJ8JcqoWBvoDLXQkwhs,5803
123
- cloudnetpy-1.80.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
- cloudnetpy-1.80.2.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
- cloudnetpy-1.80.2.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
- cloudnetpy-1.80.2.dist-info/RECORD,,
122
+ cloudnetpy-1.80.4.dist-info/METADATA,sha256=tJ94V6wE1t_w0fCUKVJg_UsWrv-1JmEWPSo0lcFQB24,5803
123
+ cloudnetpy-1.80.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
+ cloudnetpy-1.80.4.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
+ cloudnetpy-1.80.4.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
+ cloudnetpy-1.80.4.dist-info/RECORD,,