cloudnetpy 1.73.0__py3-none-any.whl → 1.73.2__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.
@@ -37,18 +37,18 @@ class Disdrometer(DataSource):
37
37
  self.append_data(self.dataset.variables[key][:], key)
38
38
 
39
39
  def _interpolate(self, y: ma.MaskedArray, x_new: np.ndarray) -> np.ndarray:
40
- if ma.getmask(y) is ma.nomask:
41
- non_masked_indices = np.arange(len(y))
42
- elif y.mask.all():
43
- return ma.masked_all(x_new.shape)
44
- else:
45
- non_masked_indices = np.where(~y.mask)[0]
46
- non_masked_values = y[non_masked_indices]
47
- non_masked_time = self.time[non_masked_indices]
48
- fun = interp1d(non_masked_time, non_masked_values, fill_value="extrapolate")
40
+ time = self.time
41
+ mask = ma.getmask(y)
42
+ if mask is not ma.nomask:
43
+ if np.all(mask):
44
+ return ma.masked_all(x_new.shape)
45
+ not_masked = ~mask
46
+ y = y[not_masked]
47
+ time = time[not_masked]
48
+ fun = interp1d(time, y, fill_value="extrapolate")
49
49
  interpolated_array = ma.array(fun(x_new))
50
50
  max_time = 1 / 60 # min -> fraction hour
51
- mask_ind = get_gap_ind(non_masked_time, x_new, max_time)
51
+ mask_ind = get_gap_ind(time, x_new, max_time)
52
52
 
53
53
  if len(mask_ind) > 0:
54
54
  msg = f"Unable to interpolate disdrometer for {len(mask_ind)} time steps"
@@ -5,7 +5,7 @@ import cloudnetpy.constants as con
5
5
 
6
6
 
7
7
  def calc_liquid_specific_attenuation(
8
- temperature: npt.NDArray, frequency: float
8
+ temperature: npt.NDArray, frequency: float | np.floating
9
9
  ) -> npt.NDArray:
10
10
  """Calculate cloud liquid water specific attenuation coefficient for
11
11
  frequency up to 200 GHz.
@@ -43,7 +43,7 @@ def calc_gas_specific_attenuation(
43
43
  pressure: npt.NDArray,
44
44
  vapor_pressure: npt.NDArray,
45
45
  temperature: npt.NDArray,
46
- frequency: float,
46
+ frequency: float | np.floating,
47
47
  ) -> npt.NDArray:
48
48
  """Calculate specific attenuation due to dry air and water vapor for
49
49
  frequency up to 1000 GHz.
@@ -72,7 +72,7 @@ def calc_gas_specific_attenuation(
72
72
 
73
73
 
74
74
  def _calc_line_shape(
75
- frequency: float,
75
+ frequency: float | np.floating,
76
76
  center: npt.NDArray,
77
77
  width: npt.NDArray,
78
78
  correction: npt.NDArray | float,
@@ -92,7 +92,7 @@ def _calc_line_shape(
92
92
  def _calc_oxygen_refractivity(
93
93
  dry_pressure: npt.NDArray,
94
94
  vapor_pressure: npt.NDArray,
95
- frequency: float,
95
+ frequency: float | np.floating,
96
96
  theta: npt.NDArray,
97
97
  ) -> npt.NDArray:
98
98
  f0, a1, a2, a3, a4, a5, a6 = OXYGEN_TABLE[:, :, np.newaxis, np.newaxis]
@@ -119,7 +119,7 @@ def _calc_oxygen_refractivity(
119
119
  def _calc_vapor_refractivity(
120
120
  dry_pressure: npt.NDArray,
121
121
  vapor_pressure: npt.NDArray,
122
- frequency: float,
122
+ frequency: float | np.floating,
123
123
  theta: npt.NDArray,
124
124
  ) -> npt.NDArray:
125
125
  f0, b1, b2, b3, b4, b5, b6 = VAPOR_TABLE[:, :, np.newaxis, np.newaxis]
@@ -166,7 +166,7 @@ def _basetop(dprof: np.ndarray, pind: int) -> tuple[int, int]:
166
166
  def _get_temp_indices(t_prof: np.ndarray, t_range: tuple) -> np.ndarray:
167
167
  """Finds indices of temperature profile covering the given range."""
168
168
  ind = np.where((t_prof > min(t_range) + T0) & (t_prof < max(t_range) + T0))[0]
169
- return np.array([]) if len(ind) == 0 else np.arange(min(ind), max(ind) + 1)
169
+ return np.array([]) if len(ind) == 0 else np.arange(np.min(ind), np.max(ind) + 1)
170
170
 
171
171
 
172
172
  def _find_model_temperature_range(model_type: str) -> tuple[float, float]:
@@ -105,6 +105,7 @@ def ceilo2nc(
105
105
  ceilo_obj.screen_invalid_values()
106
106
  ceilo_obj.prepare_data()
107
107
  ceilo_obj.data_to_cloudnet_arrays()
108
+ ceilo_obj.add_site_geolocation()
108
109
  attributes = output.add_time_attribute(ATTRIBUTES, ceilo_obj.date)
109
110
  output.update_attributes(ceilo_obj.data, attributes)
110
111
  for key in ("beta", "beta_smooth"):
@@ -93,9 +93,6 @@ class Ceilometer:
93
93
  msg = "Instrument wavelength not defined"
94
94
  raise RuntimeError(msg)
95
95
  self.data["wavelength"] = float(self.instrument.wavelength)
96
- for key in ("latitude", "longitude", "altitude"):
97
- if key in self.site_meta:
98
- self.data[key] = float(self.site_meta[key])
99
96
 
100
97
  def get_date_and_time(self, epoch: Epoch) -> None:
101
98
  if "time" not in self.data:
@@ -113,6 +110,9 @@ class Ceilometer:
113
110
  else:
114
111
  self.data[key] = CloudnetArray(array, key)
115
112
 
113
+ def add_site_geolocation(self):
114
+ utils.add_site_geolocation(self.data, gps=False, site_meta=self.site_meta)
115
+
116
116
  def screen_depol(self) -> None:
117
117
  key = "depolarisation"
118
118
  if key in self.data:
@@ -1,13 +1,16 @@
1
1
  import logging
2
+ from typing import TYPE_CHECKING
2
3
 
3
- import netCDF4
4
4
  import numpy as np
5
5
  from numpy import ma
6
6
 
7
7
  from cloudnetpy import utils
8
8
  from cloudnetpy.cloudnetarray import CloudnetArray
9
9
  from cloudnetpy.exceptions import ValidTimeStampError
10
- from cloudnetpy.instruments.instruments import BASTA, FMCW35, FMCW94, Instrument
10
+ from cloudnetpy.instruments.instruments import BASTA, FMCW35, FMCW94, HATPRO, Instrument
11
+
12
+ if TYPE_CHECKING:
13
+ import netCDF4
11
14
 
12
15
 
13
16
  class CloudnetInstrument:
@@ -20,77 +23,13 @@ class CloudnetInstrument:
20
23
  self.instrument: Instrument | None = None
21
24
 
22
25
  def add_site_geolocation(self) -> None:
23
- for key in ("latitude", "longitude", "altitude"):
24
- value = None
25
- source = None
26
- # From source data (BASTA, RPG-FMCW).
27
- # Should be the accurate GPS coordinates.
28
- # HATPRO is handled elsewhere.
29
- if (
30
- value is None
31
- and self.instrument is not None
32
- and self.instrument in (BASTA, FMCW94, FMCW35)
33
- ):
34
- data = None
35
- if (
36
- hasattr(self, "dataset")
37
- and isinstance(self.dataset, netCDF4.Dataset)
38
- and key in self.dataset.variables
39
- ):
40
- data = self.dataset[key][:]
41
- elif key in self.data:
42
- data = self.data[key].data
43
- if (
44
- data is not None
45
- and not np.all(ma.getmaskarray(data))
46
- and np.any(data != 0)
47
- ):
48
- value = data[data != 0]
49
- source = "GPS"
50
- # User-supplied site coordinate.
51
- if value is None and key in self.site_meta:
52
- value = self.site_meta[key]
53
- source = "site coordinates"
54
- # From source data (CHM15k, CL61, MRR-PRO, Copernicus, Galileo...).
55
- # Assume value is manually set, so cannot trust it.
56
- if (
57
- value is None
58
- and hasattr(self, "dataset")
59
- and isinstance(self.dataset, netCDF4.Dataset)
60
- and key in self.dataset.variables
61
- and not np.all(ma.getmaskarray(self.dataset[key][:]))
62
- ):
63
- value = self.dataset[key][:]
64
- source = "raw file"
65
- # From source global attributes (MIRA).
66
- # Seems to be manually set, so cannot trust it.
67
- if (
68
- value is None
69
- and hasattr(self, "dataset")
70
- and isinstance(self.dataset, netCDF4.Dataset)
71
- and hasattr(
72
- self.dataset,
73
- key.capitalize(),
74
- )
75
- ):
76
- value = self._parse_global_attribute_numeral(key.capitalize())
77
- source = "raw file"
78
- if value is not None:
79
- value = float(ma.mean(value))
80
- # Convert from 0...360 to -180...180
81
- if key == "longitude" and value > 180:
82
- value -= 360
83
- self.data[key] = CloudnetArray(value, key, source=source)
84
-
85
- def _parse_global_attribute_numeral(self, key: str) -> float | None:
86
- new_str = ""
87
- attr = getattr(self.dataset, key)
88
- if attr == "Unknown":
89
- return None
90
- for char in attr:
91
- if char.isdigit() or char == ".":
92
- new_str += char
93
- return float(new_str)
26
+ has_gps = self.instrument in (BASTA, FMCW94, FMCW35, HATPRO)
27
+ utils.add_site_geolocation(
28
+ self.data,
29
+ gps=has_gps,
30
+ site_meta=self.site_meta,
31
+ dataset=self.dataset if hasattr(self, "dataset") else None,
32
+ )
94
33
 
95
34
  def add_height(self) -> None:
96
35
  zenith_angle = self._get_zenith_angle()
@@ -106,21 +106,7 @@ def hatpro2l1c(
106
106
  if "irt" in hatpro.data:
107
107
  hatpro.data["irt"].dimensions = ("time", "ir_channel")
108
108
 
109
- lat = hatpro.data["latitude"].data
110
- lon = hatpro.data["longitude"].data
111
- valid_latlon = (lat != 0) | (lon != 0)
112
- if np.any(valid_latlon):
113
- lat = float(ma.mean(lat[valid_latlon]))
114
- lon = float(ma.mean(lon[valid_latlon]))
115
- latlon_source = "GPS"
116
- else:
117
- lat = site_meta["latitude"]
118
- lon = site_meta["longitude"]
119
- latlon_source = "site coordinates"
120
- alt = float(site_meta["altitude"])
121
- hatpro.data["latitude"] = CloudnetArray(lat, "latitude", source=latlon_source)
122
- hatpro.data["longitude"] = CloudnetArray(lon, "longitude", source=latlon_source)
123
- hatpro.data["altitude"] = CloudnetArray(alt, "altitude", source="site coordinates")
109
+ utils.add_site_geolocation(hatpro.data, gps=True, site_meta=site_meta)
124
110
 
125
111
  attrs_copy = ATTRIBUTES_1B01.copy()
126
112
  attributes = output.add_time_attribute(attrs_copy, hatpro.date)
@@ -60,6 +60,7 @@ def pollyxt2nc(
60
60
  polly.prepare_data()
61
61
  polly.screen_completely_masked_profiles()
62
62
  polly.data_to_cloudnet_arrays(time_dtype="f8")
63
+ polly.add_site_geolocation()
63
64
  attributes = output.add_time_attribute(ATTRIBUTES, polly.date)
64
65
  output.update_attributes(polly.data, attributes)
65
66
  polly.add_snr_info("beta", snr_limit)
@@ -352,7 +352,7 @@ def plot_colormesh(ax, data: np.ndarray, axes: tuple, variable_info) -> None:
352
352
  colorbar = init_colorbar(pl, ax)
353
353
  if variable_info.plot_scale == "logarithmic":
354
354
  tick_labels = get_log_cbar_tick_labels(vmin, vmax)
355
- colorbar.set_ticks(np.arange(vmin, vmax + 1).tolist())
355
+ colorbar.set_ticks(np.arange(vmin, vmax + 1).tolist()) # type: ignore[arg-type]
356
356
  colorbar.ax.set_yticklabels(tick_labels)
357
357
  ax.set_facecolor("white")
358
358
  colorbar.set_label(variable_info.clabel, fontsize=13)
@@ -589,7 +589,7 @@ class Plot2D(Plot):
589
589
  cbar.set_label(str(self._plot_meta.clabel), fontsize=13)
590
590
 
591
591
  if self._is_log:
592
- cbar.set_ticks(np.arange(vmin, vmax + 1).tolist())
592
+ cbar.set_ticks(np.arange(vmin, vmax + 1).tolist()) # type: ignore[arg-type]
593
593
  tick_labels = get_log_cbar_tick_labels(vmin, vmax)
594
594
  cbar.ax.set_yticklabels(tick_labels)
595
595
 
@@ -89,7 +89,6 @@ class Mwr:
89
89
 
90
90
  def harmonize(self, product: Literal["multi", "single"]) -> str:
91
91
  self._truncate_global_attributes()
92
- self._copy_variable_values()
93
92
  self._copy_global_attributes()
94
93
  self._fix_variable_attributes()
95
94
  self._write_missing_global_attributes(product)
@@ -99,12 +98,6 @@ class Mwr:
99
98
  for attr in self.nc_l2.ncattrs():
100
99
  delattr(self.nc_l2, attr)
101
100
 
102
- def _copy_variable_values(self):
103
- keys = ("latitude", "longitude", "altitude")
104
- for var in keys:
105
- if var in self.nc_l2.variables:
106
- self.nc_l2.variables[var][:] = self.nc_l1c.variables[var][:]
107
-
108
101
  def _copy_global_attributes(self):
109
102
  keys = ("year", "month", "day", "location", "source")
110
103
  output.copy_global(self.nc_l1c, self.nc_l2, keys)
cloudnetpy/utils.py CHANGED
@@ -15,10 +15,12 @@ from typing import Literal, TypeVar
15
15
 
16
16
  import netCDF4
17
17
  import numpy as np
18
+ import numpy.typing as npt
18
19
  from numpy import ma
19
20
  from scipy import ndimage, stats
20
21
  from scipy.interpolate import RectBivariateSpline, RegularGridInterpolator, griddata
21
22
 
23
+ from cloudnetpy.cloudnetarray import CloudnetArray
22
24
  from cloudnetpy.constants import SEC_IN_DAY, SEC_IN_HOUR, SEC_IN_MINUTE
23
25
  from cloudnetpy.exceptions import ValidTimeStampError
24
26
 
@@ -1050,3 +1052,100 @@ def _calc_hash_sum(filename, method, *, is_base64: bool) -> str:
1050
1052
  if is_base64:
1051
1053
  return base64.encodebytes(hash_sum.digest()).decode("utf-8").strip()
1052
1054
  return hash_sum.hexdigest()
1055
+
1056
+
1057
+ def add_site_geolocation(
1058
+ data: dict,
1059
+ *,
1060
+ gps: bool,
1061
+ site_meta: dict | None = None,
1062
+ dataset: netCDF4.Dataset | None = None,
1063
+ ):
1064
+ tmp_data = {}
1065
+ tmp_source = {}
1066
+
1067
+ for key in ("latitude", "longitude", "altitude"):
1068
+ value = None
1069
+ source = None
1070
+ # Prefer accurate GPS coordinates.
1071
+ if gps:
1072
+ values = None
1073
+ if isinstance(dataset, netCDF4.Dataset) and key in dataset.variables:
1074
+ values = dataset[key][:]
1075
+ elif key in data:
1076
+ values = data[key].data
1077
+ if (
1078
+ values is not None
1079
+ and not np.all(ma.getmaskarray(values))
1080
+ and np.any(values != 0)
1081
+ ):
1082
+ value = ma.masked_where(values == 0, values)
1083
+ source = "GPS"
1084
+ # User-supplied site coordinate.
1085
+ if value is None and site_meta is not None and key in site_meta:
1086
+ value = float(site_meta[key])
1087
+ source = "site coordinates"
1088
+ # From source data (CHM15k, CL61, MRR-PRO, Copernicus, Galileo...).
1089
+ # Assume value is manually set, so cannot trust it.
1090
+ if (
1091
+ value is None
1092
+ and isinstance(dataset, netCDF4.Dataset)
1093
+ and key in dataset.variables
1094
+ and not np.all(ma.getmaskarray(dataset[key][:]))
1095
+ ):
1096
+ value = dataset[key][:]
1097
+ source = "raw file"
1098
+ # From source global attributes (MIRA).
1099
+ # Seems to be manually set, so cannot trust it.
1100
+ if (
1101
+ value is None
1102
+ and isinstance(dataset, netCDF4.Dataset)
1103
+ and hasattr(dataset, key.capitalize())
1104
+ ):
1105
+ value = _parse_global_attribute_numeral(dataset, key.capitalize())
1106
+ source = "raw file"
1107
+ if value is not None:
1108
+ tmp_data[key] = value
1109
+ tmp_source[key] = source
1110
+
1111
+ if "latitude" in tmp_data and "longitude" in tmp_data:
1112
+ lat = np.atleast_1d(tmp_data["latitude"])
1113
+ lon = np.atleast_1d(tmp_data["longitude"])
1114
+ lon[lon > 180] - 360
1115
+ if _are_stationary(lat, lon):
1116
+ tmp_data["latitude"] = float(ma.mean(lat))
1117
+ tmp_data["longitude"] = float(ma.mean(lon))
1118
+ else:
1119
+ tmp_data["latitude"] = lat
1120
+ tmp_data["longitude"] = lon
1121
+
1122
+ if "altitude" in tmp_data:
1123
+ alt = np.atleast_1d(tmp_data["altitude"])
1124
+ if ma.max(alt) - ma.min(alt) < 100:
1125
+ tmp_data["altitude"] = float(ma.mean(alt))
1126
+
1127
+ for key in ("latitude", "longitude", "altitude"):
1128
+ if key in tmp_data:
1129
+ data[key] = CloudnetArray(tmp_data[key], key, source=tmp_source[key])
1130
+
1131
+
1132
+ def _parse_global_attribute_numeral(dataset: netCDF4.Dataset, key: str) -> float | None:
1133
+ new_str = ""
1134
+ attr = getattr(dataset, key)
1135
+ if attr == "Unknown":
1136
+ return None
1137
+ for char in attr:
1138
+ if char.isdigit() or char == ".":
1139
+ new_str += char
1140
+ return float(new_str)
1141
+
1142
+
1143
+ def _are_stationary(latitude: npt.NDArray, longitude: npt.NDArray) -> bool:
1144
+ min_lat, max_lat = np.min(latitude), np.max(latitude)
1145
+ min_lon, max_lon = np.min(longitude), np.max(longitude)
1146
+ lat_threshold = 0.01 # deg, around 1 km
1147
+ avg_lat = (min_lat + max_lat) / 2
1148
+ lon_threshold = lat_threshold / np.cos(np.radians(avg_lat))
1149
+ lat_diff = max_lat - min_lat
1150
+ lon_diff = max_lon - min_lon
1151
+ return lat_diff <= lat_threshold and lon_diff <= lon_threshold
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 73
3
- PATCH = 0
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.73.0
3
+ Version: 1.73.2
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -8,22 +8,22 @@ cloudnetpy/exceptions.py,sha256=hYbUtBwjCIfxnPe_5mELDEw87AWITBrwuo7WYIEKmJ8,1579
8
8
  cloudnetpy/metadata.py,sha256=lO7BCbVAzFoH3Nq-VuezYX0f7MnbG1Zp11g5GSiuQwM,6189
9
9
  cloudnetpy/output.py,sha256=l0LoOhcGCBrg2EJ4NT1xZ7-UKWdV7X7yQ0fJmhkwJVc,15829
10
10
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- cloudnetpy/utils.py,sha256=U0iMIKPiKLrLVAfs_u9pPuoWYW1RJHcM8dbLF9a4yIA,29796
12
- cloudnetpy/version.py,sha256=3tb7RR3Otpei74n8G_komkzbUlDjdwa11eUTBVCQFw0,72
11
+ cloudnetpy/utils.py,sha256=ui6sq8g1HlgfOQO644iNHsRGqpDwS3q-5uGR2y2tOAk,33325
12
+ cloudnetpy/version.py,sha256=O-ZDKRFC3Nc0B4ktZmifX0cT6SR1S3t5k0zOx1eDVn0,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
16
  cloudnetpy/categorize/categorize.py,sha256=HtttmUlnLE4Cw3QLdz-DRfRpd8sVr_Tp4A62XI67x24,20739
17
17
  cloudnetpy/categorize/classify.py,sha256=qovHgHsMku5kpl3cJxKteNBsG8GAkfI3Zo8QhJwZSFQ,8512
18
18
  cloudnetpy/categorize/containers.py,sha256=evqVQOoUycBtaFeKpms7_NuM9z8jKWq37nLIhoDxa8k,5278
19
- cloudnetpy/categorize/disdrometer.py,sha256=keU3pFvKtk840A0oLwAyNDuqOCswBPJEKf2bV0YWyA8,2004
19
+ cloudnetpy/categorize/disdrometer.py,sha256=sRSt2B932lrrkvycKoSaKEIaDVfq9Z7uU-4iHRr-fC0,1893
20
20
  cloudnetpy/categorize/droplet.py,sha256=t49KEsH5ZM68JQ4NvAf9kGgQ-evic1T4de2-jgJ2f4M,8683
21
21
  cloudnetpy/categorize/falling.py,sha256=lok0HMi1ewf9pS70mq62nRKL6wJzMyWbYmv1cdwrwnA,4404
22
22
  cloudnetpy/categorize/freezing.py,sha256=eSFD37R7vBrg7mgfSanrwhBjnFyWNBpjw2AtvRmSh48,3753
23
23
  cloudnetpy/categorize/insects.py,sha256=9J5agmktit8Or66GGNue-bThiaG9rB2SuPNZBXI7FCE,5243
24
- cloudnetpy/categorize/itu.py,sha256=fnyPE4FreZhwXHJbOPTlHKeG9hTXuJZIKt_VBUQqiJo,10234
24
+ cloudnetpy/categorize/itu.py,sha256=ffXK27guyRS4d66VWQ2h4UEGjUIhGjPKbFmj7kh698c,10304
25
25
  cloudnetpy/categorize/lidar.py,sha256=YQrM_LOz8NQrrD9l9HyujV1GSGwkQ8LMqXN13bEJRW4,2605
26
- cloudnetpy/categorize/melting.py,sha256=Oi80SrB4pNBhZlFhb6ayXkT2KMtXXV2rYu6jzEGn7tg,6211
26
+ cloudnetpy/categorize/melting.py,sha256=ZnLeL_qWmiCdjXVOm9iBYHdo29Brqxu_DEErZPqUloQ,6217
27
27
  cloudnetpy/categorize/model.py,sha256=QFRCY0TvM2fzGRyP8BNkqbvu13XcQjt7TsN5fhjI_Uc,6654
28
28
  cloudnetpy/categorize/mwr.py,sha256=F7cquERWL6mBkgboqeaCIPf9gOlKI-NWUQIBdQXGT_I,1635
29
29
  cloudnetpy/categorize/radar.py,sha256=0Wg5u2aLXRVhHiFiXb4fSqY_iGgSwcCMMVshM3wBoo0,14149
@@ -35,20 +35,20 @@ cloudnetpy/categorize/attenuations/rain_attenuation.py,sha256=qazJzRyXf9vbjJhh4y
35
35
  cloudnetpy/instruments/__init__.py,sha256=sbJZBYWynZbGAWb8VMMaT5qXuCyzG1LwEdHhVxFXVMk,500
36
36
  cloudnetpy/instruments/basta.py,sha256=Lb_EhQTI93S5Bd9osDbCE_tC8gZreRsHz7D2_dFOjmE,3793
37
37
  cloudnetpy/instruments/bowtie.py,sha256=Hp4mzjGqvYw5bhgAy_LvScYrf3Xm3ULbtPjhG9GnAJ8,2977
38
- cloudnetpy/instruments/ceilo.py,sha256=rkP6Vo90eS5ZhnKxZpnkuiG5ZEP86lDK8zRqoMY1aqg,9498
39
- cloudnetpy/instruments/ceilometer.py,sha256=pdmLVljsuciyKpaGxWxJ_f1IrJK-UrkBC0lSeuirLlU,12095
38
+ cloudnetpy/instruments/ceilo.py,sha256=qM3AkQKHUblhRCD42HsB6lr82giBH-0g_VzoWHZDgeA,9535
39
+ cloudnetpy/instruments/ceilometer.py,sha256=ati9-fUQ54K9tvynIPB-nlBYwtvBVaQtUCjVCLNB67w,12059
40
40
  cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoGGA,1990
41
- cloudnetpy/instruments/cloudnet_instrument.py,sha256=3lKAhGd6RZx9tuyX86uJTrrkdHNRmICsmk0ZV7TkE5Q,6954
41
+ cloudnetpy/instruments/cloudnet_instrument.py,sha256=3qJe8STIvsU8irj79xuElFUZa0jUsSSg2lq7Ozo1om4,4401
42
42
  cloudnetpy/instruments/copernicus.py,sha256=99idcn6-iKOSvSslNjwFRng3gwlTLFjKPiT1tnVytpQ,6613
43
43
  cloudnetpy/instruments/galileo.py,sha256=BjWE15_S3tTCOmAM5k--oicI3wghKaO0hv9EUBxtbl8,4830
44
- cloudnetpy/instruments/hatpro.py,sha256=_k6vZzgI9BUQ9Razge2IdaQEdrhT3tCxnplU2p5ijPc,9629
44
+ cloudnetpy/instruments/hatpro.py,sha256=D1iTR58ao6zA556LegPDhh4JHozxiup_9mUuLjR0NzE,9006
45
45
  cloudnetpy/instruments/instruments.py,sha256=97hHMjp8fp2IKihr0XJYY3BrOlBArU7gYwYmt3OxqvU,4124
46
46
  cloudnetpy/instruments/lufft.py,sha256=nIoEKuuFGKq2dLqkX7zW-HpAifefG472tZhKfXE1yoA,4212
47
47
  cloudnetpy/instruments/mira.py,sha256=Wofp8HbiAwJce_IbOLjpEFV07H_Kh4170C9Wygiz-ew,11401
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=HlaZeH5939R86ukF8K-P4Kfzb5-CpLB15LU2u94C5eI,7330
51
- cloudnetpy/instruments/pollyxt.py,sha256=ra7sYQ_cmkC0T9TBYrMN6iiQEZimmWGdW9Ilv61JB-Q,10027
51
+ cloudnetpy/instruments/pollyxt.py,sha256=U3g-ttmcs02LuLwVOydP3GjeNcmDyoYQroB-leIGdHY,10060
52
52
  cloudnetpy/instruments/radiometrics.py,sha256=ySG4a042XkgjMTG8d20oAPNvFvw9bMwwiqS3zv-JF_w,11825
53
53
  cloudnetpy/instruments/rain_e_h3.py,sha256=9TdpP4UzMBNIt2iE2GL6K9dFldzTHPLOrU8Q3tcosCU,5317
54
54
  cloudnetpy/instruments/rpg.py,sha256=gjvDomyoqSaeS3-X4EuesvWBp32BNoD-CeuvBOP19AI,17359
@@ -68,7 +68,7 @@ cloudnetpy/model_evaluation/utils.py,sha256=Z9VqYVdtY9yTr2JeVfBn4nccIVWCN5Fd-BCy
68
68
  cloudnetpy/model_evaluation/plotting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
69
  cloudnetpy/model_evaluation/plotting/plot_meta.py,sha256=K18Ugohh24uVAIxjZgJsmK80YwsMstm6B7ptVafONAw,3557
70
70
  cloudnetpy/model_evaluation/plotting/plot_tools.py,sha256=gV042W_AHidwPsRe2L57xdWbt3W-utcHMt_9FmfYK3M,5033
71
- cloudnetpy/model_evaluation/plotting/plotting.py,sha256=2c-7x_7meZ1Fq1ZFIbtZqIteG_gt32UZ---erEuXYbw,31209
71
+ cloudnetpy/model_evaluation/plotting/plotting.py,sha256=mGgSnQoRTh04v5RSJHsYPaqUEIR82eZqAuiszrh9rjY,31235
72
72
  cloudnetpy/model_evaluation/products/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  cloudnetpy/model_evaluation/products/advance_methods.py,sha256=rng3ZLR1Arv1AGUzq0Ehu-65628PC5LZVKpHSUpCIW8,8526
74
74
  cloudnetpy/model_evaluation/products/grid_methods.py,sha256=4no7mbKc9HlEXSNKPioqLmFZxUefuI-yqX0-Ej2jMzU,9067
@@ -102,7 +102,7 @@ cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V
102
102
  cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
103
103
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
104
104
  cloudnetpy/plotting/plot_meta.py,sha256=qfyZJNis937uM-NJseer8i4FO7I_v5jhQPyFl5Uszi8,17390
105
- cloudnetpy/plotting/plotting.py,sha256=EEdTu9H3ly5dxILNyiWjmH5iDRyTFDlFIYGUp7Yvxxs,38396
105
+ cloudnetpy/plotting/plotting.py,sha256=yQKidTESio0i8cQ_ep7dEunnx02ITgzExAa2yCqQj3s,38422
106
106
  cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
107
107
  cloudnetpy/products/classification.py,sha256=KwAiBSgFwDqhM114NIgYiUjj8HoYc7gAlc8E1QgcSig,8207
108
108
  cloudnetpy/products/der.py,sha256=soypE7uSEP4uHUCCQVEhyXsKY6e9mzV9B_2S5GUizqk,12729
@@ -114,12 +114,12 @@ cloudnetpy/products/ier.py,sha256=XW4gg_H-JWMWKToMqLVl6v8kx1S65GBwclWDCn1EfSk,59
114
114
  cloudnetpy/products/iwc.py,sha256=WcPdAZx3zW0zaNJNp2vpAD4JnG0NJjFmCUAhDWzNxMg,9459
115
115
  cloudnetpy/products/lwc.py,sha256=sl6Al2tuH3KkCBrPbWTmuz3jlD5UQJ4D6qBsn1tt2CQ,18962
116
116
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
117
- cloudnetpy/products/mwr_tools.py,sha256=rd7UC67O4fsIE5SaHVZ4qWvUJTj41ZGwgQWPwZzOM14,5377
117
+ cloudnetpy/products/mwr_tools.py,sha256=1SRaQRW6-1svfnUk25sMyWXSwRJ1fg7v48TsMENZQpg,5103
118
118
  cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
119
- cloudnetpy-1.73.0.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
119
+ cloudnetpy-1.73.2.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
120
120
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
121
- cloudnetpy-1.73.0.dist-info/METADATA,sha256=t2jW8No5Pzbx9iAxD0rhFytFG10fpylqlM5QVgauUN4,5796
122
- cloudnetpy-1.73.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
123
- cloudnetpy-1.73.0.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
124
- cloudnetpy-1.73.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
125
- cloudnetpy-1.73.0.dist-info/RECORD,,
121
+ cloudnetpy-1.73.2.dist-info/METADATA,sha256=ItQhmTus3k9nHgZhlkFBsWf3hD2qE6MI2esFpjYAS9o,5796
122
+ cloudnetpy-1.73.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
123
+ cloudnetpy-1.73.2.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
124
+ cloudnetpy-1.73.2.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
125
+ cloudnetpy-1.73.2.dist-info/RECORD,,