cloudnetpy 1.56.1__py3-none-any.whl → 1.56.3__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 +0 -27
- cloudnetpy/categorize/atmos_utils.py +0 -10
- cloudnetpy/categorize/categorize.py +1 -6
- cloudnetpy/categorize/classify.py +0 -12
- cloudnetpy/categorize/containers.py +0 -6
- cloudnetpy/categorize/droplet.py +0 -17
- cloudnetpy/categorize/falling.py +0 -3
- cloudnetpy/categorize/freezing.py +0 -5
- cloudnetpy/categorize/insects.py +0 -3
- cloudnetpy/categorize/lidar.py +0 -1
- cloudnetpy/categorize/melting.py +0 -3
- cloudnetpy/categorize/model.py +0 -5
- cloudnetpy/categorize/mwr.py +0 -2
- cloudnetpy/categorize/radar.py +0 -8
- cloudnetpy/cloudnetarray.py +0 -6
- cloudnetpy/concat_lib.py +0 -5
- cloudnetpy/datasource.py +0 -12
- cloudnetpy/instruments/basta.py +0 -5
- cloudnetpy/instruments/ceilo.py +0 -4
- cloudnetpy/instruments/ceilometer.py +0 -2
- cloudnetpy/instruments/copernicus.py +0 -6
- cloudnetpy/instruments/disdrometer/parsivel.py +0 -5
- cloudnetpy/instruments/disdrometer/thies.py +0 -4
- cloudnetpy/instruments/galileo.py +0 -5
- cloudnetpy/instruments/hatpro.py +0 -6
- cloudnetpy/instruments/mira.py +0 -5
- cloudnetpy/instruments/mrr.py +0 -5
- cloudnetpy/instruments/nc_radar.py +0 -2
- cloudnetpy/instruments/pollyxt.py +0 -3
- cloudnetpy/instruments/radiometrics.py +0 -4
- cloudnetpy/instruments/rpg.py +0 -5
- cloudnetpy/instruments/rpg_reader.py +0 -1
- cloudnetpy/instruments/vaisala.py +0 -4
- cloudnetpy/instruments/weather_station.py +0 -3
- cloudnetpy/model_evaluation/file_handler.py +0 -4
- cloudnetpy/model_evaluation/plotting/plotting.py +0 -6
- cloudnetpy/model_evaluation/products/advance_methods.py +0 -1
- cloudnetpy/model_evaluation/products/grid_methods.py +0 -2
- cloudnetpy/model_evaluation/products/model_products.py +0 -2
- cloudnetpy/model_evaluation/products/observation_products.py +0 -2
- cloudnetpy/model_evaluation/products/product_resampling.py +0 -4
- cloudnetpy/model_evaluation/products/tools.py +0 -2
- cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -4
- cloudnetpy/output.py +0 -9
- cloudnetpy/products/classification.py +0 -3
- cloudnetpy/products/der.py +0 -4
- cloudnetpy/products/drizzle.py +0 -8
- cloudnetpy/products/drizzle_error.py +0 -2
- cloudnetpy/products/drizzle_tools.py +0 -12
- cloudnetpy/products/ier.py +0 -4
- cloudnetpy/products/iwc.py +0 -4
- cloudnetpy/products/lwc.py +0 -14
- cloudnetpy/products/product_tools.py +0 -9
- cloudnetpy/utils.py +0 -81
- cloudnetpy/version.py +1 -1
- {cloudnetpy-1.56.1.dist-info → cloudnetpy-1.56.3.dist-info}/METADATA +4 -5
- {cloudnetpy-1.56.1.dist-info → cloudnetpy-1.56.3.dist-info}/RECORD +60 -60
- {cloudnetpy-1.56.1.dist-info → cloudnetpy-1.56.3.dist-info}/LICENSE +0 -0
- {cloudnetpy-1.56.1.dist-info → cloudnetpy-1.56.3.dist-info}/WHEEL +0 -0
- {cloudnetpy-1.56.1.dist-info → cloudnetpy-1.56.3.dist-info}/top_level.txt +0 -0
cloudnetpy/categorize/atmos.py
CHANGED
@@ -27,16 +27,13 @@ def calc_lwc_change_rate(temperature: np.ndarray, pressure: np.ndarray) -> np.nd
|
|
27
27
|
with height, given the cloud base temperature and pressure.
|
28
28
|
|
29
29
|
Args:
|
30
|
-
----
|
31
30
|
temperature: Temperature of cloud base (K).
|
32
31
|
pressure: Pressure of cloud base (Pa).
|
33
32
|
|
34
33
|
Returns:
|
35
|
-
-------
|
36
34
|
dlwc/dz (kg m-3 m-1)
|
37
35
|
|
38
36
|
References:
|
39
|
-
----------
|
40
37
|
Brenguier, 1991, https://bit.ly/2QCSJtb
|
41
38
|
|
42
39
|
"""
|
@@ -59,12 +56,10 @@ def calc_mixing_ratio(svp: np.ndarray, pressure: np.ndarray) -> np.ndarray:
|
|
59
56
|
"""Calculates mixing ratio from saturation vapor pressure and pressure.
|
60
57
|
|
61
58
|
Args:
|
62
|
-
----
|
63
59
|
svp: Saturation vapor pressure (Pa).
|
64
60
|
pressure: Atmospheric pressure (Pa).
|
65
61
|
|
66
62
|
Returns:
|
67
|
-
-------
|
68
63
|
Mixing ratio (kg kg-1).
|
69
64
|
|
70
65
|
"""
|
@@ -79,13 +74,11 @@ def calc_air_density(
|
|
79
74
|
"""Calculates air density (kg m-3).
|
80
75
|
|
81
76
|
Args:
|
82
|
-
----
|
83
77
|
pressure: Pressure (Pa).
|
84
78
|
temperature: Temperature (K).
|
85
79
|
svp_mixing_ratio: Saturation vapor pressure mixing ratio (kg/kg).
|
86
80
|
|
87
81
|
Returns:
|
88
|
-
-------
|
89
82
|
Air density (kg m-3).
|
90
83
|
|
91
84
|
"""
|
@@ -96,12 +89,10 @@ def get_attenuations(data: dict, classification: ClassificationResult) -> dict:
|
|
96
89
|
"""Calculates attenuations due to atmospheric gases and liquid water.
|
97
90
|
|
98
91
|
Args:
|
99
|
-
----
|
100
92
|
data: Containing :class:`Model` and :class:`Mwr` instances.
|
101
93
|
classification: A :class:`ClassificationResult` instance.
|
102
94
|
|
103
95
|
Returns:
|
104
|
-
-------
|
105
96
|
Dictionary containing `radar_gas_atten`, `radar_liquid_atten`,
|
106
97
|
`liquid_atten_err`, `liquid_corrected` and `liquid_uncorrected` fields.
|
107
98
|
|
@@ -121,12 +112,10 @@ class Attenuation:
|
|
121
112
|
"""Base class for gas and liquid attenuations.
|
122
113
|
|
123
114
|
Args:
|
124
|
-
----
|
125
115
|
model: The :class:`Model` instance.
|
126
116
|
classification: The :class:`ClassificationResult` instance.
|
127
117
|
|
128
118
|
Attributes:
|
129
|
-
----------
|
130
119
|
classification (ClassificationResult): The :class:`ClassificationResult`
|
131
120
|
instance.
|
132
121
|
|
@@ -143,12 +132,10 @@ class GasAttenuation(Attenuation):
|
|
143
132
|
"""Radar gas attenuation class. Child of Attenuation.
|
144
133
|
|
145
134
|
Args:
|
146
|
-
----
|
147
135
|
data: Containing :class:`Model` instance.
|
148
136
|
classification: The :class:`ClassificationResult` instance.
|
149
137
|
|
150
138
|
Attributes:
|
151
|
-
----------
|
152
139
|
atten (ndarray): Gas attenuation (dB).
|
153
140
|
|
154
141
|
"""
|
@@ -180,12 +167,10 @@ class LiquidAttenuation(Attenuation):
|
|
180
167
|
"""Radar liquid attenuation class. Child of Attenuation.
|
181
168
|
|
182
169
|
Args:
|
183
|
-
----
|
184
170
|
data: Containing :class:`Model` and :class:`Mwr` instances.
|
185
171
|
classification: The :class:`ClassificationResult` instance.
|
186
172
|
|
187
173
|
Attributes:
|
188
|
-
----------
|
189
174
|
atten (ndarray): Radar liquid attenuation (dB).
|
190
175
|
atten_err (ndarray): Error of radar liquid attenuation (dB).
|
191
176
|
uncorrected (ndarray): Boolean array denoting uncorrected pixels.
|
@@ -255,12 +240,10 @@ def fill_clouds_with_lwc_dz(atmosphere: tuple, is_liquid: np.ndarray) -> np.ndar
|
|
255
240
|
"""Fills liquid clouds with lwc change rate at the cloud bases.
|
256
241
|
|
257
242
|
Args:
|
258
|
-
----
|
259
243
|
atmosphere: 2-element tuple containing temperature (K) and pressure (Pa).
|
260
244
|
is_liquid: Boolean array indicating presence of liquid clouds.
|
261
245
|
|
262
246
|
Returns:
|
263
|
-
-------
|
264
247
|
Liquid water content change rate (kg/m3/m), so that for each cloud the base
|
265
248
|
value is filled for the whole cloud.
|
266
249
|
|
@@ -278,12 +261,10 @@ def get_lwc_change_rate_at_bases(
|
|
278
261
|
"""Finds LWC change rate in liquid cloud bases.
|
279
262
|
|
280
263
|
Args:
|
281
|
-
----
|
282
264
|
atmosphere: 2-element tuple containing temperature (K) and pressure (Pa).
|
283
265
|
is_liquid: Boolean array indicating presence of liquid clouds.
|
284
266
|
|
285
267
|
Returns:
|
286
|
-
-------
|
287
268
|
Liquid water content change rate at cloud bases (kg/m3/m).
|
288
269
|
|
289
270
|
"""
|
@@ -300,11 +281,9 @@ def find_cloud_bases(array: np.ndarray) -> np.ndarray:
|
|
300
281
|
"""Finds bases of clouds.
|
301
282
|
|
302
283
|
Args:
|
303
|
-
----
|
304
284
|
array: 2D boolean array denoting clouds or some other similar field.
|
305
285
|
|
306
286
|
Returns:
|
307
|
-
-------
|
308
287
|
Boolean array indicating bases of the individual clouds.
|
309
288
|
|
310
289
|
"""
|
@@ -317,11 +296,9 @@ def find_cloud_tops(array: np.ndarray) -> np.ndarray:
|
|
317
296
|
"""Finds tops of clouds.
|
318
297
|
|
319
298
|
Args:
|
320
|
-
----
|
321
299
|
array: 2D boolean array denoting clouds or some other similar field.
|
322
300
|
|
323
301
|
Returns:
|
324
|
-
-------
|
325
302
|
Boolean array indicating tops of the individual clouds.
|
326
303
|
|
327
304
|
"""
|
@@ -359,13 +336,11 @@ def calc_adiabatic_lwc(lwc_change_rate: np.ndarray, dheight: float) -> np.ndarra
|
|
359
336
|
"""Calculates adiabatic liquid water content (kg/m3).
|
360
337
|
|
361
338
|
Args:
|
362
|
-
----
|
363
339
|
lwc_change_rate: Liquid water content change rate (kg/m3/m) calculated at the
|
364
340
|
base of each cloud and filled to that cloud.
|
365
341
|
dheight: Median difference of the height vector (m).
|
366
342
|
|
367
343
|
Returns:
|
368
|
-
-------
|
369
344
|
Liquid water content (kg/m3).
|
370
345
|
|
371
346
|
"""
|
@@ -382,12 +357,10 @@ def distribute_lwp_to_liquid_clouds(lwc: np.ndarray, lwp: np.ndarray) -> np.ndar
|
|
382
357
|
theoretical proportion, i.e., sum(scaled LWC) = measured LWP.
|
383
358
|
|
384
359
|
Args:
|
385
|
-
----
|
386
360
|
lwc: 2D liquid water content (kg/m3).
|
387
361
|
lwp: 1D liquid water path (kg/m2).
|
388
362
|
|
389
363
|
Returns:
|
390
|
-
-------
|
391
364
|
2D LWP-weighted, normalized LWC (kg/m2).
|
392
365
|
|
393
366
|
"""
|
@@ -17,15 +17,12 @@ def calc_wet_bulb_temperature(model_data: dict) -> np.ndarray:
|
|
17
17
|
expansion of a simple expression for the saturated vapour pressure.
|
18
18
|
|
19
19
|
Args:
|
20
|
-
----
|
21
20
|
model_data: Model variables `temperature`, `pressure`, `rh`.
|
22
21
|
|
23
22
|
Returns:
|
24
|
-
-------
|
25
23
|
Wet bulb temperature (K).
|
26
24
|
|
27
25
|
References:
|
28
|
-
----------
|
29
26
|
J. Sullivan and L. D. Sanders: Method for obtaining wet-bulb
|
30
27
|
temperatures by modifying the psychrometric formula.
|
31
28
|
|
@@ -66,11 +63,9 @@ def calc_saturation_vapor_pressure(temperature: np.ndarray) -> np.ndarray:
|
|
66
63
|
"""Goff-Gratch formula for saturation vapor pressure over water adopted by WMO.
|
67
64
|
|
68
65
|
Args:
|
69
|
-
----
|
70
66
|
temperature: Temperature (K).
|
71
67
|
|
72
68
|
Returns:
|
73
|
-
-------
|
74
69
|
Saturation vapor pressure (Pa).
|
75
70
|
|
76
71
|
"""
|
@@ -95,11 +90,9 @@ def calc_psychrometric_constant(pressure: np.ndarray) -> np.ndarray:
|
|
95
90
|
of water in air to the air temperature.
|
96
91
|
|
97
92
|
Args:
|
98
|
-
----
|
99
93
|
pressure: Atmospheric pressure (Pa).
|
100
94
|
|
101
95
|
Returns:
|
102
|
-
-------
|
103
96
|
Psychrometric constant value (Pa K-1)
|
104
97
|
|
105
98
|
"""
|
@@ -110,15 +103,12 @@ def calc_dew_point_temperature(vapor_pressure: np.ndarray) -> np.ndarray:
|
|
110
103
|
"""Returns dew point temperature.
|
111
104
|
|
112
105
|
Args:
|
113
|
-
----
|
114
106
|
vapor_pressure: Water vapor pressure (Pa).
|
115
107
|
|
116
108
|
Returns:
|
117
|
-
-------
|
118
109
|
Dew point temperature (K).
|
119
110
|
|
120
111
|
Notes:
|
121
|
-
-----
|
122
112
|
Method from Vaisala's white paper: "Humidity conversion formulas".
|
123
113
|
|
124
114
|
"""
|
@@ -20,10 +20,9 @@ def generate_categorize(
|
|
20
20
|
and classified as different types of scatterers such as ice, liquid,
|
21
21
|
insects, etc. Next, the radar signal is corrected for atmospheric
|
22
22
|
attenuation, and error estimates are computed. Results are saved
|
23
|
-
in *
|
23
|
+
in *output_file* which is a compressed netCDF4 file.
|
24
24
|
|
25
25
|
Args:
|
26
|
-
----
|
27
26
|
input_files: dict containing file names for calibrated `radar`, `lidar`,
|
28
27
|
`model` and `mwr` files. Optionally also `lv0_files`, a list of
|
29
28
|
RPG level 0 files.
|
@@ -31,15 +30,12 @@ def generate_categorize(
|
|
31
30
|
uuid: Set specific UUID for the file.
|
32
31
|
|
33
32
|
Returns:
|
34
|
-
-------
|
35
33
|
UUID of the generated file.
|
36
34
|
|
37
35
|
Raises:
|
38
|
-
------
|
39
36
|
RuntimeError: Failed to create the categorize file.
|
40
37
|
|
41
38
|
Notes:
|
42
|
-
-----
|
43
39
|
Separate mwr-file is not needed when using RPG cloud radar which
|
44
40
|
measures liquid water path. Then, the radar file can be used as
|
45
41
|
a mwr-file as well, i.e. {'mwr': 'radar.nc'}.
|
@@ -48,7 +44,6 @@ def generate_categorize(
|
|
48
44
|
to detect liquid droplets.
|
49
45
|
|
50
46
|
Examples:
|
51
|
-
--------
|
52
47
|
>>> from cloudnetpy.categorize import generate_categorize
|
53
48
|
>>> input_files = {'radar': 'radar.nc',
|
54
49
|
'lidar': 'lidar.nc',
|
@@ -19,22 +19,18 @@ def classify_measurements(data: dict) -> ClassificationResult:
|
|
19
19
|
time / height grid before calling this function.
|
20
20
|
|
21
21
|
Args:
|
22
|
-
----
|
23
22
|
data: Containing :class:`Radar`, :class:`Lidar`, :class:`Model`
|
24
23
|
and :class:`Mwr` instances.
|
25
24
|
|
26
25
|
Returns:
|
27
|
-
-------
|
28
26
|
A :class:`ClassificationResult` instance.
|
29
27
|
|
30
28
|
References:
|
31
|
-
----------
|
32
29
|
The Cloudnet classification scheme is based on methodology proposed by
|
33
30
|
Hogan R. and O'Connor E., 2004, https://bit.ly/2Yjz9DZ and its
|
34
31
|
proprietary Matlab implementation.
|
35
32
|
|
36
33
|
Notes:
|
37
|
-
-----
|
38
34
|
Some individual classification methods are changed in this Python
|
39
35
|
implementation compared to the original Cloudnet methodology.
|
40
36
|
Especially methods classifying insects, melting layer and liquid droplets.
|
@@ -96,14 +92,12 @@ def fetch_quality(
|
|
96
92
|
"""Returns Cloudnet quality bits.
|
97
93
|
|
98
94
|
Args:
|
99
|
-
----
|
100
95
|
data: Containing :class:`Radar` and :class:`Lidar` instances.
|
101
96
|
classification: A :class:`ClassificationResult` instance.
|
102
97
|
attenuations: Dictionary containing keys `liquid_corrected`,
|
103
98
|
`liquid_uncorrected`.
|
104
99
|
|
105
100
|
Returns:
|
106
|
-
-------
|
107
101
|
Dictionary containing `quality_bits`, an integer array with the bits:
|
108
102
|
|
109
103
|
- bit 0: Pixel contains radar data
|
@@ -136,13 +130,11 @@ def _find_aerosols(
|
|
136
130
|
Aerosols are lidar signals that are: a) not falling, b) not liquid droplets.
|
137
131
|
|
138
132
|
Args:
|
139
|
-
----
|
140
133
|
obs: A :class:`ClassData` instance.
|
141
134
|
is_falling: 2-D boolean array of falling hydrometeors.
|
142
135
|
is_liquid: 2-D boolean array of liquid droplets.
|
143
136
|
|
144
137
|
Returns:
|
145
|
-
-------
|
146
138
|
2-D boolean array containing aerosols.
|
147
139
|
|
148
140
|
"""
|
@@ -166,13 +158,11 @@ def _find_drizzle_and_falling(
|
|
166
158
|
"""Classifies pixels as falling, drizzle and others.
|
167
159
|
|
168
160
|
Args:
|
169
|
-
----
|
170
161
|
is_liquid: 2D boolean array denoting liquid layers.
|
171
162
|
is_falling: 2D boolean array denoting falling pixels.
|
172
163
|
is_freezing: 2D boolean array denoting subzero temperatures.
|
173
164
|
|
174
165
|
Returns:
|
175
|
-
-------
|
176
166
|
2D array where values are 1 (falling, drizzle, supercooled liquids),
|
177
167
|
2 (drizzle), and masked (all others).
|
178
168
|
|
@@ -191,12 +181,10 @@ def _bits_to_integer(bits: list) -> np.ndarray:
|
|
191
181
|
"""Creates array of integers from individual boolean arrays.
|
192
182
|
|
193
183
|
Args:
|
194
|
-
----
|
195
184
|
bits: List of bit fields (of similar sizes) to be saved in the resulting
|
196
185
|
array of integers. bits[0] is saved as bit 0, bits[1] as bit 1, etc.
|
197
186
|
|
198
187
|
Returns:
|
199
|
-
-------
|
200
188
|
Array of integers containing the information of the individual boolean arrays.
|
201
189
|
|
202
190
|
"""
|
@@ -24,12 +24,10 @@ class ClassData:
|
|
24
24
|
"""Container for observations that are used in the classification.
|
25
25
|
|
26
26
|
Args:
|
27
|
-
----
|
28
27
|
data: Containing :class:`Radar`, :class:`Lidar`, :class:`Model`
|
29
28
|
and :class:`Mwr` instances.
|
30
29
|
|
31
30
|
Attributes:
|
32
|
-
----------
|
33
31
|
z (ndarray): 2D radar echo.
|
34
32
|
ldr (ndarray): 2D linear depolarization ratio.
|
35
33
|
v (ndarray): 2D radar velocity.
|
@@ -84,13 +82,11 @@ def _find_rain_from_radar_echo(
|
|
84
82
|
detections as raining.
|
85
83
|
|
86
84
|
Args:
|
87
|
-
----
|
88
85
|
z: Radar echo.
|
89
86
|
time: Time vector.
|
90
87
|
time_buffer: Time in minutes.
|
91
88
|
|
92
89
|
Returns:
|
93
|
-
-------
|
94
90
|
1D Boolean array denoting profiles with rain.
|
95
91
|
|
96
92
|
"""
|
@@ -131,14 +127,12 @@ def _find_clutter(
|
|
131
127
|
"""Estimates clutter from doppler velocity.
|
132
128
|
|
133
129
|
Args:
|
134
|
-
----
|
135
130
|
n_gates: Number of range gates from the ground where clutter is expected
|
136
131
|
to be found. Default is 10.
|
137
132
|
v_lim: Velocity threshold. Smaller values are classified as clutter.
|
138
133
|
Default is 0.05 (m/s).
|
139
134
|
|
140
135
|
Returns:
|
141
|
-
-------
|
142
136
|
2-D boolean array denoting pixels contaminated by clutter.
|
143
137
|
|
144
138
|
"""
|
cloudnetpy/categorize/droplet.py
CHANGED
@@ -18,7 +18,6 @@ def correct_liquid_top(
|
|
18
18
|
"""Corrects lidar detected liquid cloud top using radar data.
|
19
19
|
|
20
20
|
Args:
|
21
|
-
----
|
22
21
|
obs: The :class:`ClassData` instance.
|
23
22
|
is_liquid: 2-D boolean array denoting liquid clouds from lidar data.
|
24
23
|
is_freezing: 2-D boolean array of sub-zero temperature, derived from the model
|
@@ -26,11 +25,9 @@ def correct_liquid_top(
|
|
26
25
|
limit: The maximum correction distance (m) above liquid cloud top.
|
27
26
|
|
28
27
|
Returns:
|
29
|
-
-------
|
30
28
|
Corrected liquid cloud array.
|
31
29
|
|
32
30
|
References:
|
33
|
-
----------
|
34
31
|
Hogan R. and O'Connor E., 2004, https://bit.ly/2Yjz9DZ.
|
35
32
|
|
36
33
|
"""
|
@@ -64,7 +61,6 @@ def find_liquid(
|
|
64
61
|
"""Estimate liquid layers from SNR-screened attenuated backscatter.
|
65
62
|
|
66
63
|
Args:
|
67
|
-
----
|
68
64
|
obs: The :class:`ClassData` instance.
|
69
65
|
peak_amp: Minimum value of peak. Default is 1e-6.
|
70
66
|
max_width: Maximum width of peak. Default is 300 (m).
|
@@ -76,11 +72,9 @@ def find_liquid(
|
|
76
72
|
min_alt: Minimum altitude of the peak from the ground. Default is 100 (m).
|
77
73
|
|
78
74
|
Returns:
|
79
|
-
-------
|
80
75
|
2-D boolean array denoting liquid layers.
|
81
76
|
|
82
77
|
References:
|
83
|
-
----------
|
84
78
|
The method is based on Tuononen, M. et.al, 2019,
|
85
79
|
https://acp.copernicus.org/articles/19/1985/2019/.
|
86
80
|
|
@@ -134,7 +128,6 @@ def ind_base(dprof: np.ndarray, ind_peak: int, dist: int, lim: float) -> int:
|
|
134
128
|
below the peak exceed a threshold value.
|
135
129
|
|
136
130
|
Args:
|
137
|
-
----
|
138
131
|
dprof: 1-D array of 1st discrete difference. Masked values should
|
139
132
|
be 0, e.g. dprof = np.diff(masked_prof).filled(0)
|
140
133
|
ind_peak: Index of (possibly local) peak in the original profile.
|
@@ -149,16 +142,13 @@ def ind_base(dprof: np.ndarray, ind_peak: int, dist: int, lim: float) -> int:
|
|
149
142
|
in the profile.
|
150
143
|
|
151
144
|
Returns:
|
152
|
-
-------
|
153
145
|
Base index of the peak.
|
154
146
|
|
155
147
|
Raises:
|
156
|
-
------
|
157
148
|
IndexError: Can't find proper base index (probably too many masked
|
158
149
|
values in the profile).
|
159
150
|
|
160
151
|
Examples:
|
161
|
-
--------
|
162
152
|
Consider a profile
|
163
153
|
|
164
154
|
>>> x = np.array([0, 0.5, 1, -99, 4, 8, 5])
|
@@ -187,7 +177,6 @@ def ind_base(dprof: np.ndarray, ind_peak: int, dist: int, lim: float) -> int:
|
|
187
177
|
1
|
188
178
|
|
189
179
|
See Also:
|
190
|
-
--------
|
191
180
|
droplet.ind_top()
|
192
181
|
|
193
182
|
"""
|
@@ -204,7 +193,6 @@ def ind_top(dprof: np.ndarray, ind_peak: int, nprof: int, dist: int, lim: float)
|
|
204
193
|
above the peak exceed a threshold value.
|
205
194
|
|
206
195
|
Args:
|
207
|
-
----
|
208
196
|
dprof: 1-D array of 1st discrete difference. Masked values should be 0, e.g.
|
209
197
|
dprof = np.diff(masked_prof).filled(0)
|
210
198
|
nprof: Length of the profile. Top index can't be higher than this.
|
@@ -218,16 +206,13 @@ def ind_top(dprof: np.ndarray, ind_peak: int, nprof: int, dist: int, lim: float)
|
|
218
206
|
likely accept some other point, higher in the profile.
|
219
207
|
|
220
208
|
Returns:
|
221
|
-
-------
|
222
209
|
Top index of the peak.
|
223
210
|
|
224
211
|
Raises:
|
225
|
-
------
|
226
212
|
IndexError: Can not find proper top index (probably too many masked
|
227
213
|
values in the profile).
|
228
214
|
|
229
215
|
See Also:
|
230
|
-
--------
|
231
216
|
droplet.ind_base()
|
232
217
|
|
233
218
|
"""
|
@@ -241,11 +226,9 @@ def interpolate_lwp(obs: ClassData) -> np.ndarray:
|
|
241
226
|
"""Linear interpolation of liquid water path to fill masked values.
|
242
227
|
|
243
228
|
Args:
|
244
|
-
----
|
245
229
|
obs: The :class:`ClassData` instance.
|
246
230
|
|
247
231
|
Returns:
|
248
|
-
-------
|
249
232
|
Liquid water path where the masked values are filled by interpolation.
|
250
233
|
|
251
234
|
"""
|
cloudnetpy/categorize/falling.py
CHANGED
@@ -21,17 +21,14 @@ def find_falling_hydrometeors(
|
|
21
21
|
temperatures.
|
22
22
|
|
23
23
|
Args:
|
24
|
-
----
|
25
24
|
obs: The :class:`ClassData` instance.
|
26
25
|
is_liquid: 2-D boolean array of liquid droplets.
|
27
26
|
is_insects: 2-D boolean array of insects.
|
28
27
|
|
29
28
|
Returns:
|
30
|
-
-------
|
31
29
|
2-D boolean array containing falling hydrometeors.
|
32
30
|
|
33
31
|
References:
|
34
|
-
----------
|
35
32
|
Hogan R. and O'Connor E., 2004, https://bit.ly/2Yjz9DZ.
|
36
33
|
|
37
34
|
"""
|
@@ -20,16 +20,13 @@ def find_freezing_region(obs: ClassData, melting_layer: np.ndarray) -> np.ndarra
|
|
20
20
|
interpolated for all profiles.
|
21
21
|
|
22
22
|
Args:
|
23
|
-
----
|
24
23
|
obs: The :class:`ClassData` instance.
|
25
24
|
melting_layer: 2-D boolean array denoting melting layer.
|
26
25
|
|
27
26
|
Returns:
|
28
|
-
-------
|
29
27
|
2-D boolean array denoting the sub-zero region.
|
30
28
|
|
31
29
|
Notes:
|
32
|
-
-----
|
33
30
|
It is not clear how model temperature and melting layer should be
|
34
31
|
ideally combined to determine the sub-zero region. This current
|
35
32
|
method differs slightly from the original Matlab code and should
|
@@ -84,12 +81,10 @@ def _find_t0_alt(temperature: np.ndarray, height: np.ndarray) -> np.ndarray:
|
|
84
81
|
"""Interpolates altitudes where temperature goes below freezing.
|
85
82
|
|
86
83
|
Args:
|
87
|
-
----
|
88
84
|
temperature: 2-D temperature (K).
|
89
85
|
height: 1-D altitude grid (m).
|
90
86
|
|
91
87
|
Returns:
|
92
|
-
-------
|
93
88
|
1-D array denoting altitudes where the temperature drops below 0 deg C.
|
94
89
|
|
95
90
|
"""
|
cloudnetpy/categorize/insects.py
CHANGED
@@ -29,7 +29,6 @@ def find_insects(
|
|
29
29
|
above melting layer.
|
30
30
|
|
31
31
|
Args:
|
32
|
-
----
|
33
32
|
obs: The :class:`ClassData` instance.
|
34
33
|
melting_layer: 2D array denoting melting layer.
|
35
34
|
liquid_layers: 2D array denoting liquid layers.
|
@@ -37,14 +36,12 @@ def find_insects(
|
|
37
36
|
Default is 0.8.
|
38
37
|
|
39
38
|
Returns:
|
40
|
-
-------
|
41
39
|
tuple: 2-element tuple containing
|
42
40
|
|
43
41
|
- 2-D boolean flag of insects presence.
|
44
42
|
- 2-D probability of pixel containing insects.
|
45
43
|
|
46
44
|
Notes:
|
47
|
-
-----
|
48
45
|
This insect detection method is novel and needs to be validated.
|
49
46
|
|
50
47
|
"""
|
cloudnetpy/categorize/lidar.py
CHANGED
cloudnetpy/categorize/melting.py
CHANGED
@@ -32,20 +32,17 @@ def find_melting_layer(obs: ClassData, *, smooth: bool = True) -> np.ndarray:
|
|
32
32
|
the rest -8..+6.
|
33
33
|
|
34
34
|
Notes:
|
35
|
-
-----
|
36
35
|
This melting layer detection method is novel and needs to be validated.
|
37
36
|
Also note that there might be some detection problems with strong
|
38
37
|
updrafts of air. In these cases the absolute values for speed do not
|
39
38
|
make sense (rain drops can even move upwards instead of down).
|
40
39
|
|
41
40
|
Args:
|
42
|
-
----
|
43
41
|
obs: The :class:`ClassData` instance.
|
44
42
|
smooth: If True, apply a small Gaussian smoother to the
|
45
43
|
melting layer. Default is True.
|
46
44
|
|
47
45
|
Returns:
|
48
|
-
-------
|
49
46
|
2-D boolean array denoting the melting layer.
|
50
47
|
|
51
48
|
"""
|
cloudnetpy/categorize/model.py
CHANGED
@@ -14,12 +14,10 @@ class Model(DataSource):
|
|
14
14
|
"""Model class, child of DataSource.
|
15
15
|
|
16
16
|
Args:
|
17
|
-
----
|
18
17
|
model_file: File name of the NWP model file.
|
19
18
|
alt_site: Altitude of the site above mean sea level (m).
|
20
19
|
|
21
20
|
Attributes:
|
22
|
-
----------
|
23
21
|
source_type (str): Model type, e.g. 'gdas1' or 'ecwmf'.
|
24
22
|
model_heights (ndarray): 2-D array of model heights (one for each time
|
25
23
|
step).
|
@@ -56,7 +54,6 @@ class Model(DataSource):
|
|
56
54
|
"""Interpolates model variables to common height grid.
|
57
55
|
|
58
56
|
Args:
|
59
|
-
----
|
60
57
|
wl_band: Integer denoting the approximate wavelength band of the
|
61
58
|
cloud radar (0 = ~35.5 GHz, 1 = ~94 GHz).
|
62
59
|
|
@@ -90,12 +87,10 @@ class Model(DataSource):
|
|
90
87
|
"""Interpolates model variables to Cloudnet's dense time / height grid.
|
91
88
|
|
92
89
|
Args:
|
93
|
-
----
|
94
90
|
time_grid: The target time array (fraction hour).
|
95
91
|
height_grid: The target height array (m).
|
96
92
|
|
97
93
|
Returns:
|
98
|
-
-------
|
99
94
|
Indices fully masked profiles.
|
100
95
|
|
101
96
|
"""
|
cloudnetpy/categorize/mwr.py
CHANGED
@@ -10,7 +10,6 @@ class Mwr(DataSource):
|
|
10
10
|
"""Microwave radiometer class, child of DataSource.
|
11
11
|
|
12
12
|
Args:
|
13
|
-
----
|
14
13
|
full_path: Cloudnet Level 1b mwr file.
|
15
14
|
|
16
15
|
"""
|
@@ -24,7 +23,6 @@ class Mwr(DataSource):
|
|
24
23
|
"""Approximates lwp and its error in a grid using mean.
|
25
24
|
|
26
25
|
Args:
|
27
|
-
----
|
28
26
|
time_grid: 1D target time grid.
|
29
27
|
|
30
28
|
"""
|
cloudnetpy/categorize/radar.py
CHANGED
@@ -16,11 +16,9 @@ class Radar(DataSource):
|
|
16
16
|
"""Radar class, child of DataSource.
|
17
17
|
|
18
18
|
Args:
|
19
|
-
----
|
20
19
|
full_path: Cloudnet Level 1 radar netCDF file.
|
21
20
|
|
22
21
|
Attributes:
|
23
|
-
----------
|
24
22
|
radar_frequency (float): Radar frequency (GHz).
|
25
23
|
folding_velocity (float): Radar's folding velocity (m/s).
|
26
24
|
location (str): Location of the radar, copied from the global attribute
|
@@ -33,7 +31,6 @@ class Radar(DataSource):
|
|
33
31
|
radars.
|
34
32
|
|
35
33
|
See Also:
|
36
|
-
--------
|
37
34
|
:func:`instruments.rpg2nc()`, :func:`instruments.mira2nc()`
|
38
35
|
|
39
36
|
"""
|
@@ -53,7 +50,6 @@ class Radar(DataSource):
|
|
53
50
|
"""Rebins radar data in time using mean.
|
54
51
|
|
55
52
|
Args:
|
56
|
-
----
|
57
53
|
time_new: Target time array as fraction hour. Updates *time* attribute.
|
58
54
|
|
59
55
|
"""
|
@@ -202,12 +198,10 @@ class Radar(DataSource):
|
|
202
198
|
"""Corrects radar echo for liquid and gas attenuation.
|
203
199
|
|
204
200
|
Args:
|
205
|
-
----
|
206
201
|
attenuations: 2-D attenuations due to atmospheric gases and liquid:
|
207
202
|
`radar_gas_atten`, `radar_liquid_atten`.
|
208
203
|
|
209
204
|
References:
|
210
|
-
----------
|
211
205
|
The method is based on Hogan R. and O'Connor E., 2004,
|
212
206
|
https://bit.ly/2Yjz9DZ and the original Cloudnet Matlab implementation.
|
213
207
|
|
@@ -228,12 +222,10 @@ class Radar(DataSource):
|
|
228
222
|
:class:`CloudnetArray` instances to `data` attribute.
|
229
223
|
|
230
224
|
Args:
|
231
|
-
----
|
232
225
|
attenuations: 2-D attenuations due to atmospheric gases.
|
233
226
|
classification: The :class:`ClassificationResult` instance.
|
234
227
|
|
235
228
|
References:
|
236
|
-
----------
|
237
229
|
The method is based on Hogan R. and O'Connor E., 2004,
|
238
230
|
https://bit.ly/2Yjz9DZ and the original Cloudnet Matlab implementation.
|
239
231
|
|