cloudnetpy 1.64.4__py3-none-any.whl → 1.65.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.py +8 -1
- cloudnetpy/categorize/categorize.py +6 -3
- cloudnetpy/categorize/containers.py +5 -1
- cloudnetpy/categorize/mwr.py +4 -0
- cloudnetpy/categorize/radar.py +1 -1
- cloudnetpy/exceptions.py +7 -0
- cloudnetpy/products/der.py +4 -0
- cloudnetpy/products/lwc.py +4 -0
- cloudnetpy/version.py +2 -2
- {cloudnetpy-1.64.4.dist-info → cloudnetpy-1.65.0.dist-info}/METADATA +1 -1
- {cloudnetpy-1.64.4.dist-info → cloudnetpy-1.65.0.dist-info}/RECORD +14 -14
- {cloudnetpy-1.64.4.dist-info → cloudnetpy-1.65.0.dist-info}/WHEEL +1 -1
- {cloudnetpy-1.64.4.dist-info → cloudnetpy-1.65.0.dist-info}/LICENSE +0 -0
- {cloudnetpy-1.64.4.dist-info → cloudnetpy-1.65.0.dist-info}/top_level.txt +0 -0
cloudnetpy/categorize/atmos.py
CHANGED
@@ -181,7 +181,14 @@ class LiquidAttenuation(Attenuation):
|
|
181
181
|
|
182
182
|
def __init__(self, data: dict, classification: ClassificationResult):
|
183
183
|
super().__init__(data["model"], classification)
|
184
|
-
|
184
|
+
if data["mwr"] is not None:
|
185
|
+
self._mwr = data["mwr"].data
|
186
|
+
else:
|
187
|
+
n_time = data["radar"].data["Z"][:].shape[0]
|
188
|
+
self._mwr = {
|
189
|
+
"lwp": ma.masked_all(n_time),
|
190
|
+
"lwp_error": ma.masked_all(n_time),
|
191
|
+
}
|
185
192
|
self._lwc_dz_err = self._get_lwc_change_rate_error()
|
186
193
|
self.atten = self._get_liquid_atten()
|
187
194
|
self.atten_err = self._get_liquid_atten_err()
|
@@ -65,9 +65,10 @@ def generate_categorize(
|
|
65
65
|
|
66
66
|
def _interpolate_to_cloudnet_grid() -> list:
|
67
67
|
wl_band = utils.get_wl_band(data["radar"].radar_frequency)
|
68
|
-
data["mwr"].rebin_to_grid(time)
|
69
68
|
if data["disdrometer"] is not None:
|
70
69
|
data["disdrometer"].interpolate_to_grid(time)
|
70
|
+
if data["mwr"] is not None:
|
71
|
+
data["mwr"].rebin_to_grid(time)
|
71
72
|
data["model"].interpolate_to_common_height(wl_band)
|
72
73
|
model_gap_ind = data["model"].interpolate_to_grid(time, height)
|
73
74
|
radar_gap_ind = data["radar"].rebin_to_grid(time)
|
@@ -115,7 +116,7 @@ def generate_categorize(
|
|
115
116
|
**data["lidar"].data,
|
116
117
|
**data["model"].data,
|
117
118
|
**data["model"].data_sparse,
|
118
|
-
**data["mwr"].data,
|
119
|
+
**(data["mwr"].data if data["mwr"] is not None else {}),
|
119
120
|
**(data["disdrometer"].data if data["disdrometer"] is not None else {}),
|
120
121
|
}
|
121
122
|
|
@@ -131,10 +132,12 @@ def generate_categorize(
|
|
131
132
|
data: dict = {
|
132
133
|
"radar": Radar(input_files["radar"]),
|
133
134
|
"lidar": Lidar(input_files["lidar"]),
|
134
|
-
"mwr": Mwr(input_files["mwr"]),
|
135
135
|
"lv0_files": input_files.get("lv0_files"),
|
136
|
+
"mwr": None,
|
136
137
|
"disdrometer": None,
|
137
138
|
}
|
139
|
+
if "mwr" in input_files:
|
140
|
+
data["mwr"] = Mwr(input_files["mwr"])
|
138
141
|
if "disdrometer" in input_files:
|
139
142
|
try:
|
140
143
|
data["disdrometer"] = Disdrometer(input_files["disdrometer"])
|
@@ -58,7 +58,11 @@ class ClassData:
|
|
58
58
|
self.tw = data["model"].data["Tw"][:]
|
59
59
|
self.model_type = data["model"].source_type
|
60
60
|
self.beta = data["lidar"].data["beta"][:]
|
61
|
-
self.lwp =
|
61
|
+
self.lwp = (
|
62
|
+
data["mwr"].data["lwp"][:]
|
63
|
+
if data["mwr"] is not None
|
64
|
+
else ma.masked_all(self.time.shape)
|
65
|
+
)
|
62
66
|
self.is_rain = self._find_profiles_with_rain()
|
63
67
|
self.is_clutter = _find_clutter(self.v, self.is_rain)
|
64
68
|
self.altitude = data["radar"].altitude
|
cloudnetpy/categorize/mwr.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
"""Mwr module, containing the :class:`Mwr` class."""
|
2
2
|
|
3
3
|
import numpy as np
|
4
|
+
import numpy.ma as ma
|
4
5
|
|
5
6
|
from cloudnetpy import utils
|
6
7
|
from cloudnetpy.constants import G_TO_KG
|
@@ -32,6 +33,9 @@ class Mwr(DataSource):
|
|
32
33
|
|
33
34
|
def _init_lwp_data(self) -> None:
|
34
35
|
lwp = self.dataset.variables["lwp"][:]
|
36
|
+
if "lwp_quality_flag" in self.dataset.variables:
|
37
|
+
quality_flag = self.dataset.variables["lwp_quality_flag"][:]
|
38
|
+
lwp[quality_flag != 0] = ma.masked
|
35
39
|
self.append_data(lwp, "lwp")
|
36
40
|
|
37
41
|
def _init_lwp_error(self) -> None:
|
cloudnetpy/categorize/radar.py
CHANGED
@@ -257,7 +257,7 @@ class Radar(DataSource):
|
|
257
257
|
noise_threshold = 3
|
258
258
|
n_pulses = _number_of_independent_pulses()
|
259
259
|
ln_to_log10 = 10 / np.log(10)
|
260
|
-
z_precision = (ln_to_log10
|
260
|
+
z_precision = ma.divide(ln_to_log10, np.sqrt(n_pulses)) * (
|
261
261
|
1 + (utils.db2lin(z_power_min - z_power) / noise_threshold)
|
262
262
|
)
|
263
263
|
gas_error = attenuations["radar_gas_atten"] * 0.1
|
cloudnetpy/exceptions.py
CHANGED
@@ -63,3 +63,10 @@ class HatproDataError(CloudnetException):
|
|
63
63
|
|
64
64
|
def __init__(self, msg: str = "Invalid HATPRO file"):
|
65
65
|
super().__init__(msg)
|
66
|
+
|
67
|
+
|
68
|
+
class InvalidSourceFileError(CloudnetException):
|
69
|
+
"""Internal exception class."""
|
70
|
+
|
71
|
+
def __init__(self, msg: str = "Invalid source file"):
|
72
|
+
super().__init__(msg)
|
cloudnetpy/products/der.py
CHANGED
@@ -10,6 +10,7 @@ from numpy import ma
|
|
10
10
|
from cloudnetpy import output, utils
|
11
11
|
from cloudnetpy.categorize import atmos
|
12
12
|
from cloudnetpy.datasource import DataSource
|
13
|
+
from cloudnetpy.exceptions import InvalidSourceFileError
|
13
14
|
from cloudnetpy.metadata import MetaData
|
14
15
|
from cloudnetpy.products.product_tools import (
|
15
16
|
CategorizeBits,
|
@@ -113,6 +114,9 @@ class DerSource(DataSource):
|
|
113
114
|
|
114
115
|
def __init__(self, categorize_file: str, parameters: Parameters | None = None):
|
115
116
|
super().__init__(categorize_file)
|
117
|
+
if "lwp" not in self.dataset.variables:
|
118
|
+
msg = "Liquid water path missing from the categorize file."
|
119
|
+
raise InvalidSourceFileError(msg)
|
116
120
|
self.is_rain = get_is_rain(categorize_file)
|
117
121
|
self.categorize_bits = CategorizeBits(categorize_file)
|
118
122
|
if parameters is None:
|
cloudnetpy/products/lwc.py
CHANGED
@@ -8,6 +8,7 @@ from numpy import ma
|
|
8
8
|
from cloudnetpy import output, utils
|
9
9
|
from cloudnetpy.categorize import atmos
|
10
10
|
from cloudnetpy.datasource import DataSource
|
11
|
+
from cloudnetpy.exceptions import InvalidSourceFileError
|
11
12
|
from cloudnetpy.metadata import MetaData
|
12
13
|
from cloudnetpy.products import product_tools as p_tools
|
13
14
|
from cloudnetpy.products.product_tools import CategorizeBits, get_is_rain
|
@@ -88,6 +89,9 @@ class LwcSource(DataSource):
|
|
88
89
|
|
89
90
|
def __init__(self, categorize_file: str):
|
90
91
|
super().__init__(categorize_file)
|
92
|
+
if "lwp" not in self.dataset.variables:
|
93
|
+
msg = "Liquid water path missing from the categorize file."
|
94
|
+
raise InvalidSourceFileError(msg)
|
91
95
|
self.lwp = self.getvar("lwp")
|
92
96
|
self.lwp[self.lwp < 0] = 0
|
93
97
|
self.lwp_error = self.getvar("lwp_error")
|
cloudnetpy/version.py
CHANGED
@@ -3,18 +3,18 @@ cloudnetpy/cloudnetarray.py,sha256=Ol1ha4RPAmFZANL__U5CaMKX4oYMXYR6OnjoCZ9w3eo,7
|
|
3
3
|
cloudnetpy/concat_lib.py,sha256=8Ek059RMLAfbbXCkX90cgnhw_8ZpcDrxw1yPvwtuitU,9846
|
4
4
|
cloudnetpy/constants.py,sha256=YVbi2porUnKIzO_PdGeH9pEO9gKa95vDcj6TBMSreoY,734
|
5
5
|
cloudnetpy/datasource.py,sha256=j7N4g59HPvOBWle-W9bOUF0BfRLgvR4zwOi_B50cI7Q,7921
|
6
|
-
cloudnetpy/exceptions.py,sha256=
|
6
|
+
cloudnetpy/exceptions.py,sha256=ns48useL9RN3mPh7CqIiLA19VI9OmVbyRsKTkwbThF8,1760
|
7
7
|
cloudnetpy/metadata.py,sha256=v_VDo2vbdTxB0zIsfP69IcrwSKiRlLpsGdq6JPI4CoA,5306
|
8
8
|
cloudnetpy/output.py,sha256=YkCaxVkG_Mt2hng_IVnhygHteV4UMKzKALkeFZwFJL8,14822
|
9
9
|
cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
10
|
cloudnetpy/utils.py,sha256=JV0Fawnme1HoZgoiidV3eIzsn6vx0AEjBNmI1CcrBsA,28517
|
11
|
-
cloudnetpy/version.py,sha256=
|
11
|
+
cloudnetpy/version.py,sha256=GyQ5dtQt1vQ9KfpnsA6Fw5Z-nvlfzCZj7jSg1WwwuhY,72
|
12
12
|
cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
|
13
|
-
cloudnetpy/categorize/atmos.py,sha256=
|
13
|
+
cloudnetpy/categorize/atmos.py,sha256=vavMC_WQQyGH14eL4vAzKLKDDZt8tBrMYimztYHOjH8,12639
|
14
14
|
cloudnetpy/categorize/atmos_utils.py,sha256=64uenj2uxj3P3Blaq_pBN1pBjcF-X4LYNt-uTOjvevg,3778
|
15
|
-
cloudnetpy/categorize/categorize.py,sha256=
|
15
|
+
cloudnetpy/categorize/categorize.py,sha256=WQobVBcCk0HbbSIVm9yNX5apwj-5S6IIX4dvleaji0Y,18070
|
16
16
|
cloudnetpy/categorize/classify.py,sha256=a-0bVCtynGfORnDGTsPuzqkuDeOOR_OMz5ai9NsMuic,9870
|
17
|
-
cloudnetpy/categorize/containers.py,sha256=
|
17
|
+
cloudnetpy/categorize/containers.py,sha256=g3SQHoqlY1uJ8b-MG-BbW3oWz5IyacA8kJBeIPy_4EA,4859
|
18
18
|
cloudnetpy/categorize/disdrometer.py,sha256=keU3pFvKtk840A0oLwAyNDuqOCswBPJEKf2bV0YWyA8,2004
|
19
19
|
cloudnetpy/categorize/droplet.py,sha256=894VHdL9ScaB8f1oxXwM2la4ShXd-uWywQDINoaoiD8,8687
|
20
20
|
cloudnetpy/categorize/falling.py,sha256=Wz49mbw0pubnbhoekYTqGT0S9UNaE88jWOjSPEsCIaI,4386
|
@@ -23,8 +23,8 @@ cloudnetpy/categorize/insects.py,sha256=9J5agmktit8Or66GGNue-bThiaG9rB2SuPNZBXI7
|
|
23
23
|
cloudnetpy/categorize/lidar.py,sha256=YQrM_LOz8NQrrD9l9HyujV1GSGwkQ8LMqXN13bEJRW4,2605
|
24
24
|
cloudnetpy/categorize/melting.py,sha256=mYdOKxfTC2InB8NdOPwr_7NpbouQMm-9f2Q1kfTqIJE,6262
|
25
25
|
cloudnetpy/categorize/model.py,sha256=rLyx9SKz56BmQ809PwwhCnbusshUuYPoqhLJbnZvrt8,5842
|
26
|
-
cloudnetpy/categorize/mwr.py,sha256=
|
27
|
-
cloudnetpy/categorize/radar.py,sha256=
|
26
|
+
cloudnetpy/categorize/mwr.py,sha256=F7cquERWL6mBkgboqeaCIPf9gOlKI-NWUQIBdQXGT_I,1635
|
27
|
+
cloudnetpy/categorize/radar.py,sha256=NCBjyC-OvkcprDnaDD0ql3WoKtSWMHcMhspTh5Zlmi8,13730
|
28
28
|
cloudnetpy/instruments/__init__.py,sha256=_jejVwi_viSZehmAOkEqTNI-0-exGgAJ_bHW1IRRwTI,398
|
29
29
|
cloudnetpy/instruments/basta.py,sha256=_OTnySd36ktvxk_swWBzbv_H4AVGlkF_Ce3KtPGD1rE,3758
|
30
30
|
cloudnetpy/instruments/campbell_scientific.py,sha256=2WHfBKQjtRSl0AqvtPeX7G8Hdi3Dn0WbvoAppFOMbA8,5270
|
@@ -97,19 +97,19 @@ cloudnetpy/plotting/plot_meta.py,sha256=JHrr-4A9fhqdi_tQFe6mR4Fdry3hkI-lmmVu5Ny2
|
|
97
97
|
cloudnetpy/plotting/plotting.py,sha256=rVaCsXTrhb0ahdXerSPLZWRASs_QktyLUbjyHoVuam8,33584
|
98
98
|
cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
|
99
99
|
cloudnetpy/products/classification.py,sha256=bNG8W1CMgGoUBpXopQjYAW3F-uEJGyojXb4A5jmErHo,7921
|
100
|
-
cloudnetpy/products/der.py,sha256=
|
100
|
+
cloudnetpy/products/der.py,sha256=1LDBbnbUg8feMUTGWJq3bObBhEcZ_Ee17MB1x0GwRdo,12669
|
101
101
|
cloudnetpy/products/drizzle.py,sha256=58C9Mo6oRXR8KpbVPghbJvHvFX9GfS3xUp058pbf0qw,10804
|
102
102
|
cloudnetpy/products/drizzle_error.py,sha256=4GwlHRtNbk9ks7bGtXCco-wXbcDOKeAQwKmbhzut6Qk,6132
|
103
103
|
cloudnetpy/products/drizzle_tools.py,sha256=LR2AtbFQRGFrJ2LGyiLxOfbnlznVLydXvb8RFDR0_4E,10848
|
104
104
|
cloudnetpy/products/ier.py,sha256=ge1f_aYick20Nlznq8zbBl5umWlTP-UwMivy4Y05Sck,7839
|
105
105
|
cloudnetpy/products/iwc.py,sha256=Q8dXV3JF3JUQgwkmQFOKakm21Tnf8oCWsH0CSqIEKl4,10209
|
106
|
-
cloudnetpy/products/lwc.py,sha256=
|
106
|
+
cloudnetpy/products/lwc.py,sha256=wSd3GDqELz4yyWBMiKDR-QhRK8scPheqsBcS1qzxYOI,18997
|
107
107
|
cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
|
108
108
|
cloudnetpy/products/mwr_tools.py,sha256=3esU5cG5GI2WVmOENqrJ0FbMuxLegADv7q8TB0RorGg,4674
|
109
109
|
cloudnetpy/products/product_tools.py,sha256=VNw2diJj30POz68-3qNVkJP7r9AUspT_d1Fp0BbeIx8,10414
|
110
110
|
docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
|
111
|
-
cloudnetpy-1.
|
112
|
-
cloudnetpy-1.
|
113
|
-
cloudnetpy-1.
|
114
|
-
cloudnetpy-1.
|
115
|
-
cloudnetpy-1.
|
111
|
+
cloudnetpy-1.65.0.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
|
112
|
+
cloudnetpy-1.65.0.dist-info/METADATA,sha256=MRy1c5jmGmBs67KS3mr2jWmkiuvmhMWh1zfdr8YZj58,5784
|
113
|
+
cloudnetpy-1.65.0.dist-info/WHEEL,sha256=nCVcAvsfA9TDtwGwhYaRrlPhTLV9m-Ga6mdyDtuwK18,91
|
114
|
+
cloudnetpy-1.65.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
|
115
|
+
cloudnetpy-1.65.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|