cloudnetpy 1.66.18__py3-none-any.whl → 1.67.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +18 -3
- cloudnetpy/instruments/mira.py +8 -2
- cloudnetpy/model_evaluation/products/observation_products.py +1 -1
- cloudnetpy/plotting/plotting.py +43 -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.18.dist-info → cloudnetpy-1.67.0.dist-info}/METADATA +1 -1
- {cloudnetpy-1.66.18.dist-info → cloudnetpy-1.67.0.dist-info}/RECORD +20 -20
- {cloudnetpy-1.66.18.dist-info → cloudnetpy-1.67.0.dist-info}/LICENSE +0 -0
- {cloudnetpy-1.66.18.dist-info → cloudnetpy-1.67.0.dist-info}/WHEEL +0 -0
- {cloudnetpy-1.66.18.dist-info → cloudnetpy-1.67.0.dist-info}/entry_points.txt +0 -0
- {cloudnetpy-1.66.18.dist-info → cloudnetpy-1.67.0.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",
|
@@ -142,11 +150,18 @@ HALO = Instrument(
|
|
142
150
|
model="StreamLine",
|
143
151
|
)
|
144
152
|
|
145
|
-
|
146
|
-
manufacturer="
|
153
|
+
WINDCUBE_WLS200S = Instrument(
|
154
|
+
manufacturer="Vaisala",
|
155
|
+
domain="lidar",
|
156
|
+
category="Doppler lidar",
|
157
|
+
model="WindCube WLS200S",
|
158
|
+
)
|
159
|
+
|
160
|
+
WINDCUBE_WLS70 = Instrument(
|
161
|
+
manufacturer="Vaisala",
|
147
162
|
domain="lidar",
|
148
163
|
category="Doppler lidar",
|
149
|
-
model="WindCube",
|
164
|
+
model="WindCube WLS70",
|
150
165
|
)
|
151
166
|
|
152
167
|
PARSIVEL2 = Instrument(
|
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
|
|
@@ -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
|
-
|
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
|
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
|
@@ -45,6 +46,9 @@ class PlotParameters:
|
|
45
46
|
plot_meta: Additional metadata for the plot.
|
46
47
|
raise_on_empty: Whether to raise an error if no data is found for a
|
47
48
|
plotted variable.
|
49
|
+
minor_ticks: Whether to display minor ticks on the x-axis.
|
50
|
+
plot_above_ground: Whether to plot above ground instead of above mean sea level.
|
51
|
+
|
48
52
|
"""
|
49
53
|
|
50
54
|
dpi: float = 120
|
@@ -58,6 +62,8 @@ class PlotParameters:
|
|
58
62
|
footer_text: str | None = None
|
59
63
|
plot_meta: PlotMeta | None = None
|
60
64
|
raise_on_empty: bool = False
|
65
|
+
minor_ticks: bool = False
|
66
|
+
plot_above_ground: bool = False
|
61
67
|
|
62
68
|
|
63
69
|
class Dimensions:
|
@@ -170,15 +176,35 @@ class FigureData:
|
|
170
176
|
m2mm = 1e3
|
171
177
|
file_type = getattr(self.file, "cloudnet_file_type", "")
|
172
178
|
if file_type == "model":
|
173
|
-
|
179
|
+
height = ma.mean(self.file.variables["height"][:], axis=0) # height AGL
|
180
|
+
if not self.options.plot_above_ground:
|
181
|
+
site_alt = self._calc_ground_altitude()
|
182
|
+
height += site_alt
|
183
|
+
return height * m2km
|
174
184
|
if "height" in self.file.variables:
|
175
|
-
|
185
|
+
height = self.file.variables["height"][:] # height AMSL
|
186
|
+
if self.options.plot_above_ground:
|
187
|
+
if "altitude" not in self.file.variables:
|
188
|
+
msg = "No altitude information in the file."
|
189
|
+
raise ValueError(msg)
|
190
|
+
height -= self.file.variables["altitude"][:]
|
191
|
+
return height * m2km
|
176
192
|
if "range" in self.file.variables:
|
177
193
|
return self.file.variables["range"][:] * m2km
|
178
194
|
if "diameter" in self.file.variables:
|
179
195
|
return self.file.variables["diameter"][:] * m2mm
|
180
196
|
return None
|
181
197
|
|
198
|
+
def _calc_ground_altitude(self) -> float:
|
199
|
+
if (
|
200
|
+
"sfc_geopotential" in self.file.variables
|
201
|
+
and "gdas1" not in self.file.source.lower() # uncertain unit in gdas1
|
202
|
+
):
|
203
|
+
return np.mean(self.file.variables["sfc_geopotential"][:]) / con.G
|
204
|
+
pressure = ma.mean(self.file.variables["pressure"][:, 0])
|
205
|
+
temperature = ma.mean(self.file.variables["temperature"][:, 0])
|
206
|
+
return calc_altitude(temperature, pressure)
|
207
|
+
|
182
208
|
def is_mwrpy_product(self) -> bool:
|
183
209
|
cloudnet_file_type = getattr(self.file, "cloudnet_file_type", "")
|
184
210
|
return cloudnet_file_type in ("mwr-single", "mwr-multi")
|
@@ -198,7 +224,8 @@ class SubPlot:
|
|
198
224
|
self.ax = ax
|
199
225
|
self.variable = variable
|
200
226
|
self.options = options
|
201
|
-
self.
|
227
|
+
self.file_type = file_type
|
228
|
+
self.plot_meta = self._read_plot_meta()
|
202
229
|
|
203
230
|
def set_xax(self) -> None:
|
204
231
|
resolution = 4
|
@@ -210,6 +237,9 @@ class SubPlot:
|
|
210
237
|
]
|
211
238
|
self.ax.set_xticks(np.arange(0, 25, resolution, dtype=int))
|
212
239
|
self.ax.set_xticklabels(x_tick_labels, fontsize=12)
|
240
|
+
if self.options.minor_ticks:
|
241
|
+
self.ax.xaxis.set_minor_locator(AutoMinorLocator(4))
|
242
|
+
self.ax.tick_params(which="minor", length=2.5)
|
213
243
|
self.ax.set_xlim(0, 24)
|
214
244
|
|
215
245
|
def set_yax(
|
@@ -217,7 +247,11 @@ class SubPlot:
|
|
217
247
|
ylabel: str | None = None,
|
218
248
|
y_limits: tuple[float, float] | None = None,
|
219
249
|
) -> None:
|
220
|
-
|
250
|
+
height_str = (
|
251
|
+
"Height (km AGL)" if self.options.plot_above_ground else "Height (km AMSL)"
|
252
|
+
)
|
253
|
+
|
254
|
+
label = ylabel if ylabel is not None else height_str
|
221
255
|
self.ax.set_ylabel(label, fontsize=13)
|
222
256
|
if y_limits is not None:
|
223
257
|
self.ax.set_ylim(*y_limits)
|
@@ -282,12 +316,12 @@ class SubPlot:
|
|
282
316
|
va="bottom",
|
283
317
|
)
|
284
318
|
|
285
|
-
def _read_plot_meta(self
|
319
|
+
def _read_plot_meta(self) -> PlotMeta:
|
286
320
|
if self.options.plot_meta is not None:
|
287
321
|
plot_meta = self.options.plot_meta
|
288
322
|
else:
|
289
323
|
fallback = ATTRIBUTES["fallback"].get(self.variable.name, PlotMeta())
|
290
|
-
file_attributes = ATTRIBUTES.get(file_type or "", {})
|
324
|
+
file_attributes = ATTRIBUTES.get(self.file_type or "", {})
|
291
325
|
plot_meta = file_attributes.get(self.variable.name, fallback)
|
292
326
|
if plot_meta.clabel is None:
|
293
327
|
plot_meta = plot_meta._replace(clabel=_reformat_units(self.variable.units))
|
@@ -542,7 +576,7 @@ class Plot2D(Plot):
|
|
542
576
|
self._plot_contour(
|
543
577
|
figure_data,
|
544
578
|
alt,
|
545
|
-
levels=np.array([T0]),
|
579
|
+
levels=np.array([con.T0]),
|
546
580
|
colors="gray",
|
547
581
|
linewidths=1.25,
|
548
582
|
linestyles="dashed",
|
@@ -910,6 +944,7 @@ def _get_max_gap_in_minutes(figure_data: FigureData) -> float:
|
|
910
944
|
"mwr-multi": 35,
|
911
945
|
"weather-station": 12,
|
912
946
|
"doppler-lidar-wind": 75,
|
947
|
+
"doppler-lidar": 75,
|
913
948
|
"radar": 5,
|
914
949
|
}
|
915
950
|
return max_allowed_gap.get(file_type, 10)
|
@@ -72,7 +72,12 @@ class DrizzleSource(DataSource):
|
|
72
72
|
"""Returns string corresponding the radar frequency."""
|
73
73
|
radar_frequency = float(self.getvar("radar_frequency"))
|
74
74
|
wl_band = utils.get_wl_band(radar_frequency)
|
75
|
-
|
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=9-gHFlbKlJNv6v3rFfs2bpwbFn9E2SIntv6AB3MKCTc,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=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
|
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.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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|