cloudnetpy 1.66.19__py3-none-any.whl → 1.67.1__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.
- cloudnetpy/categorize/atmos_utils.py +15 -0
- cloudnetpy/categorize/attenuations/melting_attenuation.py +4 -3
- cloudnetpy/constants.py +4 -0
- cloudnetpy/instruments/cloudnet_instrument.py +10 -4
- cloudnetpy/instruments/instruments.py +8 -0
- cloudnetpy/instruments/mira.py +13 -3
- cloudnetpy/model_evaluation/products/observation_products.py +1 -1
- cloudnetpy/plotting/plotting.py +36 -8
- cloudnetpy/products/drizzle_tools.py +6 -1
- cloudnetpy/products/ier.py +2 -2
- cloudnetpy/products/iwc.py +1 -1
- cloudnetpy/products/product_tools.py +11 -5
- cloudnetpy/utils.py +11 -9
- cloudnetpy/version.py +2 -2
- {cloudnetpy-1.66.19.dist-info → cloudnetpy-1.67.1.dist-info}/METADATA +1 -1
- {cloudnetpy-1.66.19.dist-info → cloudnetpy-1.67.1.dist-info}/RECORD +20 -20
- {cloudnetpy-1.66.19.dist-info → cloudnetpy-1.67.1.dist-info}/LICENSE +0 -0
- {cloudnetpy-1.66.19.dist-info → cloudnetpy-1.67.1.dist-info}/WHEEL +0 -0
- {cloudnetpy-1.66.19.dist-info → cloudnetpy-1.67.1.dist-info}/entry_points.txt +0 -0
- {cloudnetpy-1.66.19.dist-info → cloudnetpy-1.67.1.dist-info}/top_level.txt +0 -0
@@ -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
|
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
|
-
|
68
|
+
band = utils.get_wl_band(frequency)
|
69
|
+
if band == "Ka":
|
69
70
|
a, b = 0.97, 0.61
|
70
|
-
elif
|
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
|
-
|
56
|
-
|
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",
|
cloudnetpy/instruments/mira.py
CHANGED
@@ -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
|
|
@@ -69,7 +69,11 @@ def mira2nc(
|
|
69
69
|
n_profiles = utils.n_elements(mira.time, 5, "time")
|
70
70
|
valid_ind = utils.remove_masked_blocks(mira.data["Zh"][:], limit=n_profiles)
|
71
71
|
mira.screen_time_indices(valid_ind)
|
72
|
-
|
72
|
+
|
73
|
+
# Default limit seems to remove too much with MIRA-10.
|
74
|
+
snr_limit = -30 if mira.instrument == MIRA10 else None
|
75
|
+
mira.screen_by_snr(snr_limit)
|
76
|
+
|
73
77
|
mira.screen_invalid_ldr()
|
74
78
|
mira.mask_invalid_data()
|
75
79
|
mira.mask_bad_angles()
|
@@ -99,7 +103,13 @@ class Mira(NcRadar):
|
|
99
103
|
def __init__(self, full_path: str, site_meta: dict):
|
100
104
|
super().__init__(full_path, site_meta)
|
101
105
|
self.date = self._init_mira_date()
|
102
|
-
|
106
|
+
if "model" not in site_meta or site_meta["model"] == "mira-35":
|
107
|
+
self.instrument = MIRA35
|
108
|
+
elif site_meta["model"] == "mira-10":
|
109
|
+
self.instrument = MIRA10
|
110
|
+
else:
|
111
|
+
msg = f"Invalid model: {site_meta['model']}"
|
112
|
+
raise ValueError(msg)
|
103
113
|
|
104
114
|
def screen_by_date(self, expected_date: str) -> None:
|
105
115
|
"""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
|
115
|
+
if wband == "W":
|
116
116
|
rainrate_threshold = 2
|
117
117
|
return rainrate_threshold
|
118
118
|
|
cloudnetpy/plotting/plotting.py
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
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
|
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
|
-
|
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):
|
cloudnetpy/products/ier.py
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
import numpy as np
|
4
4
|
from numpy import ma
|
5
5
|
|
6
|
-
from cloudnetpy import constants, output
|
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 =
|
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(
|
cloudnetpy/products/iwc.py
CHANGED
@@ -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 =
|
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.
|
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 ==
|
222
|
+
if self.wl_band == "Ka":
|
221
223
|
return IceCoefficients(0.878, -0.000205, -0.0015, 0.0016, -1.52)
|
222
|
-
|
223
|
-
|
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
|
-
|
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) ->
|
695
|
-
"""Returns
|
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
|
-
|
701
|
+
IEEE radar band as string.
|
702
702
|
|
703
703
|
"""
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
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
@@ -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=
|
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=
|
12
|
-
cloudnetpy/version.py,sha256=
|
11
|
+
cloudnetpy/utils.py,sha256=U0iMIKPiKLrLVAfs_u9pPuoWYW1RJHcM8dbLF9a4yIA,29796
|
12
|
+
cloudnetpy/version.py,sha256=u_pBdoJWrb-jv8zCxh-KreSGf1jMuH5AX7sNYEwvID4,72
|
13
13
|
cloudnetpy/categorize/__init__.py,sha256=s-SJaysvVpVVo5kidiruWQO6p3gv2TXwY1wEHYO5D6I,44
|
14
|
-
cloudnetpy/categorize/atmos_utils.py,sha256=
|
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
|
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=
|
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=
|
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=
|
47
|
+
cloudnetpy/instruments/mira.py,sha256=rG3YoYYdh2vOeNq_0o5o1S35CmAT6xV-UH62HtbfIqE,10264
|
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
|
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=
|
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=
|
111
|
-
cloudnetpy/products/ier.py,sha256=
|
112
|
-
cloudnetpy/products/iwc.py,sha256=
|
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=
|
116
|
+
cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
|
117
117
|
docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
|
118
|
-
cloudnetpy-1.
|
119
|
-
cloudnetpy-1.
|
120
|
-
cloudnetpy-1.
|
121
|
-
cloudnetpy-1.
|
122
|
-
cloudnetpy-1.
|
123
|
-
cloudnetpy-1.
|
118
|
+
cloudnetpy-1.67.1.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
|
119
|
+
cloudnetpy-1.67.1.dist-info/METADATA,sha256=AqSZKLMqYMfY--9RbUCV-_uE5-8bT71tkk4Y7hv7XC0,5793
|
120
|
+
cloudnetpy-1.67.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
121
|
+
cloudnetpy-1.67.1.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
|
122
|
+
cloudnetpy-1.67.1.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
|
123
|
+
cloudnetpy-1.67.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|