cloudnetpy 1.49.9__py3-none-any.whl → 1.87.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.
Files changed (116) hide show
  1. cloudnetpy/categorize/__init__.py +1 -2
  2. cloudnetpy/categorize/atmos_utils.py +297 -67
  3. cloudnetpy/categorize/attenuation.py +31 -0
  4. cloudnetpy/categorize/attenuations/__init__.py +37 -0
  5. cloudnetpy/categorize/attenuations/gas_attenuation.py +30 -0
  6. cloudnetpy/categorize/attenuations/liquid_attenuation.py +84 -0
  7. cloudnetpy/categorize/attenuations/melting_attenuation.py +78 -0
  8. cloudnetpy/categorize/attenuations/rain_attenuation.py +84 -0
  9. cloudnetpy/categorize/categorize.py +332 -156
  10. cloudnetpy/categorize/classify.py +127 -125
  11. cloudnetpy/categorize/containers.py +107 -76
  12. cloudnetpy/categorize/disdrometer.py +40 -0
  13. cloudnetpy/categorize/droplet.py +23 -21
  14. cloudnetpy/categorize/falling.py +53 -24
  15. cloudnetpy/categorize/freezing.py +25 -12
  16. cloudnetpy/categorize/insects.py +35 -23
  17. cloudnetpy/categorize/itu.py +243 -0
  18. cloudnetpy/categorize/lidar.py +36 -41
  19. cloudnetpy/categorize/melting.py +34 -26
  20. cloudnetpy/categorize/model.py +84 -37
  21. cloudnetpy/categorize/mwr.py +18 -14
  22. cloudnetpy/categorize/radar.py +215 -102
  23. cloudnetpy/cli.py +578 -0
  24. cloudnetpy/cloudnetarray.py +43 -89
  25. cloudnetpy/concat_lib.py +218 -78
  26. cloudnetpy/constants.py +28 -10
  27. cloudnetpy/datasource.py +61 -86
  28. cloudnetpy/exceptions.py +49 -20
  29. cloudnetpy/instruments/__init__.py +5 -0
  30. cloudnetpy/instruments/basta.py +29 -12
  31. cloudnetpy/instruments/bowtie.py +135 -0
  32. cloudnetpy/instruments/ceilo.py +138 -115
  33. cloudnetpy/instruments/ceilometer.py +164 -80
  34. cloudnetpy/instruments/cl61d.py +21 -5
  35. cloudnetpy/instruments/cloudnet_instrument.py +74 -36
  36. cloudnetpy/instruments/copernicus.py +108 -30
  37. cloudnetpy/instruments/da10.py +54 -0
  38. cloudnetpy/instruments/disdrometer/common.py +126 -223
  39. cloudnetpy/instruments/disdrometer/parsivel.py +453 -94
  40. cloudnetpy/instruments/disdrometer/thies.py +254 -87
  41. cloudnetpy/instruments/fd12p.py +201 -0
  42. cloudnetpy/instruments/galileo.py +65 -23
  43. cloudnetpy/instruments/hatpro.py +123 -49
  44. cloudnetpy/instruments/instruments.py +113 -1
  45. cloudnetpy/instruments/lufft.py +39 -17
  46. cloudnetpy/instruments/mira.py +268 -61
  47. cloudnetpy/instruments/mrr.py +187 -0
  48. cloudnetpy/instruments/nc_lidar.py +19 -8
  49. cloudnetpy/instruments/nc_radar.py +109 -55
  50. cloudnetpy/instruments/pollyxt.py +135 -51
  51. cloudnetpy/instruments/radiometrics.py +313 -59
  52. cloudnetpy/instruments/rain_e_h3.py +171 -0
  53. cloudnetpy/instruments/rpg.py +321 -189
  54. cloudnetpy/instruments/rpg_reader.py +74 -40
  55. cloudnetpy/instruments/toa5.py +49 -0
  56. cloudnetpy/instruments/vaisala.py +95 -343
  57. cloudnetpy/instruments/weather_station.py +774 -105
  58. cloudnetpy/metadata.py +90 -19
  59. cloudnetpy/model_evaluation/file_handler.py +55 -52
  60. cloudnetpy/model_evaluation/metadata.py +46 -20
  61. cloudnetpy/model_evaluation/model_metadata.py +1 -1
  62. cloudnetpy/model_evaluation/plotting/plot_tools.py +32 -37
  63. cloudnetpy/model_evaluation/plotting/plotting.py +327 -117
  64. cloudnetpy/model_evaluation/products/advance_methods.py +92 -83
  65. cloudnetpy/model_evaluation/products/grid_methods.py +88 -63
  66. cloudnetpy/model_evaluation/products/model_products.py +43 -35
  67. cloudnetpy/model_evaluation/products/observation_products.py +41 -35
  68. cloudnetpy/model_evaluation/products/product_resampling.py +17 -7
  69. cloudnetpy/model_evaluation/products/tools.py +29 -20
  70. cloudnetpy/model_evaluation/statistics/statistical_methods.py +30 -20
  71. cloudnetpy/model_evaluation/tests/e2e/conftest.py +3 -3
  72. cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +9 -5
  73. cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +15 -14
  74. cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +9 -5
  75. cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +15 -14
  76. cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +9 -5
  77. cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +15 -14
  78. cloudnetpy/model_evaluation/tests/unit/conftest.py +42 -41
  79. cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +41 -48
  80. cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +216 -194
  81. cloudnetpy/model_evaluation/tests/unit/test_model_products.py +23 -21
  82. cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +37 -38
  83. cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +43 -40
  84. cloudnetpy/model_evaluation/tests/unit/test_plotting.py +30 -36
  85. cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +68 -31
  86. cloudnetpy/model_evaluation/tests/unit/test_tools.py +33 -26
  87. cloudnetpy/model_evaluation/utils.py +2 -1
  88. cloudnetpy/output.py +170 -111
  89. cloudnetpy/plotting/__init__.py +2 -1
  90. cloudnetpy/plotting/plot_meta.py +562 -822
  91. cloudnetpy/plotting/plotting.py +1142 -704
  92. cloudnetpy/products/__init__.py +1 -0
  93. cloudnetpy/products/classification.py +370 -88
  94. cloudnetpy/products/der.py +85 -55
  95. cloudnetpy/products/drizzle.py +77 -34
  96. cloudnetpy/products/drizzle_error.py +15 -11
  97. cloudnetpy/products/drizzle_tools.py +79 -59
  98. cloudnetpy/products/epsilon.py +211 -0
  99. cloudnetpy/products/ier.py +27 -50
  100. cloudnetpy/products/iwc.py +55 -48
  101. cloudnetpy/products/lwc.py +96 -70
  102. cloudnetpy/products/mwr_tools.py +186 -0
  103. cloudnetpy/products/product_tools.py +170 -128
  104. cloudnetpy/utils.py +455 -240
  105. cloudnetpy/version.py +2 -2
  106. {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info}/METADATA +44 -40
  107. cloudnetpy-1.87.3.dist-info/RECORD +127 -0
  108. {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info}/WHEEL +1 -1
  109. cloudnetpy-1.87.3.dist-info/entry_points.txt +2 -0
  110. docs/source/conf.py +2 -2
  111. cloudnetpy/categorize/atmos.py +0 -361
  112. cloudnetpy/products/mwr_multi.py +0 -68
  113. cloudnetpy/products/mwr_single.py +0 -75
  114. cloudnetpy-1.49.9.dist-info/RECORD +0 -112
  115. {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info/licenses}/LICENSE +0 -0
  116. {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,7 @@ PRODUCT = "cf"
13
13
 
14
14
 
15
15
  @pytest.mark.parametrize("name", ("ecmwf_cf_cirrus",))
16
- def test_cf_cirrus_filter(obs_file, model_file, name):
16
+ def test_cf_cirrus_filter(obs_file, model_file, name) -> None:
17
17
  obs = ObservationManager(PRODUCT, str(obs_file))
18
18
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
19
19
  AdvanceProductMethods(model, str(model_file), obs)
@@ -23,11 +23,17 @@ def test_cf_cirrus_filter(obs_file, model_file, name):
23
23
  @pytest.mark.parametrize(
24
24
  "name, data",
25
25
  [
26
- ("cf", ma.array([[ma.masked, 2], [3, 6], [5, 8]])),
26
+ (
27
+ "cf",
28
+ ma.array(
29
+ [[-99, 2], [3, 6], [5, 8]],
30
+ mask=[[True, False], [False, False], [False, False]],
31
+ ),
32
+ ),
27
33
  ("h", np.array([[10, 14], [8, 14], [9, 15]])),
28
34
  ],
29
35
  )
30
- def test_getvar_from_object(obs_file, model_file, name, data):
36
+ def test_getvar_from_object(obs_file, model_file, name, data) -> None:
31
37
  obs = ObservationManager(PRODUCT, str(obs_file))
32
38
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
33
39
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -36,7 +42,7 @@ def test_getvar_from_object(obs_file, model_file, name, data):
36
42
 
37
43
 
38
44
  @pytest.mark.parametrize("name", ("T",))
39
- def test_getvar_from_object_None(obs_file, model_file, name):
45
+ def test_getvar_from_object_None(obs_file, model_file, name) -> None:
40
46
  obs = ObservationManager(PRODUCT, str(obs_file))
41
47
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
42
48
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -51,7 +57,7 @@ def test_getvar_from_object_None(obs_file, model_file, name):
51
57
  (95, (0.00058, -0.00706, 0.0923, -0.992)),
52
58
  ],
53
59
  )
54
- def test_set_frequency_parameters(obs_file, model_file, radar_f, values):
60
+ def test_set_frequency_parameters(obs_file, model_file, radar_f, values) -> None:
55
61
  obs = ObservationManager(PRODUCT, str(obs_file))
56
62
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
57
63
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -60,40 +66,43 @@ def test_set_frequency_parameters(obs_file, model_file, radar_f, values):
60
66
  assert x == values
61
67
 
62
68
 
63
- def test_fit_z_sensitivity(obs_file, model_file):
69
+ def test_fit_z_sensitivity(obs_file, model_file) -> None:
64
70
  obs = ObservationManager(PRODUCT, str(obs_file))
65
71
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
66
72
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
67
73
  h = np.array([[5000, 9000, 13000], [10000, 15000, 20000], [8000, 12000, 16000]])
68
- compare = np.array([[0, 0.15, 0.5], [0.1, 1, 0], [0.15, 0, 1]])
74
+ compare = ma.masked_invalid([[np.nan, 0.15, 0.5], [0.1, 1, np.nan], [0.15, 0, 1]])
69
75
  x = adv_pro.fit_z_sensitivity(h)
70
76
  testing.assert_array_almost_equal(x, compare)
71
77
 
72
78
 
73
- def test_filter_high_iwc_low_cf(obs_file, model_file):
79
+ def test_filter_high_iwc_low_cf(obs_file, model_file) -> None:
74
80
  obs = ObservationManager(PRODUCT, str(obs_file))
75
81
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
76
82
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
77
83
  cf = ma.array([0.0001, 0.0002, 0, 0.0001, 1, 0.0006])
78
84
  iwc = np.array([0.0, 0, 0, 0.2, 0.4, 0])
79
85
  lwc = np.array([0.0, 0.02, 0.01, 0, 0.01, 0.01])
80
- compare = ma.array([0.0001, 0.0002, 0, ma.masked, 1, 0.0006])
86
+ compare = ma.array(
87
+ [0.0001, 0.0002, 0, -99, 1, 0.0006],
88
+ mask=[False, False, False, True, False, False],
89
+ )
81
90
  x = adv_pro.filter_high_iwc_low_cf(cf, iwc, lwc)
82
91
  testing.assert_array_almost_equal(x, compare)
83
92
 
84
93
 
85
- @pytest.mark.xfail(raises=ValueError)
86
- def test_filter_high_iwc_low_cf_no_ice(obs_file, model_file):
94
+ def test_filter_high_iwc_low_cf_no_ice(obs_file, model_file) -> None:
87
95
  obs = ObservationManager(PRODUCT, str(obs_file))
88
96
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
89
97
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
90
98
  cf = ma.array([0.0001, 0.0002, 0, 0, 0, 0.0006])
91
99
  iwc = np.array([0.0, 0, 0, 0.2, 0.4, 0])
92
100
  lwc = np.array([0.0, 0.02, 0.01, 0, 0.01, 0.01])
93
- adv_pro.filter_high_iwc_low_cf(cf, iwc, lwc)
101
+ with pytest.raises(ValueError):
102
+ adv_pro.filter_high_iwc_low_cf(cf, iwc, lwc)
94
103
 
95
104
 
96
- def test_mask_weird_indices(obs_file, model_file):
105
+ def test_mask_weird_indices(obs_file, model_file) -> None:
97
106
  obs = ObservationManager(PRODUCT, str(obs_file))
98
107
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
99
108
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -108,19 +117,22 @@ def test_mask_weird_indices(obs_file, model_file):
108
117
  testing.assert_array_almost_equal(x, compare)
109
118
 
110
119
 
111
- def test_mask_weird_indices_values(obs_file, model_file):
120
+ def test_mask_weird_indices_values(obs_file, model_file) -> None:
112
121
  obs = ObservationManager(PRODUCT, str(obs_file))
113
122
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
114
123
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
115
124
  cf = ma.array([0.0001, 0.0002, 0, 0.0001, 1, 0.0006])
116
125
  iwc = np.array([0.0, 0, 0, 0.2, 0.4, 0])
117
126
  lwc = np.array([0.0, 0.02, 0.01, 0, 0.01, 0.01])
118
- compare = ma.array([0.0001, 0.0002, 0, ma.masked, 1, 0.0006])
127
+ compare = ma.array(
128
+ [0.0001, 0.0002, 0, -99, 1, 0.0006],
129
+ mask=[False, False, False, True, False, False],
130
+ )
119
131
  x = adv_pro.mask_weird_indices(cf, iwc, lwc)
120
132
  testing.assert_array_almost_equal(x, compare)
121
133
 
122
134
 
123
- def test_find_ice_in_clouds(obs_file, model_file):
135
+ def test_find_ice_in_clouds(obs_file, model_file) -> None:
124
136
  obs = ObservationManager(PRODUCT, str(obs_file))
125
137
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
126
138
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -128,26 +140,26 @@ def test_find_ice_in_clouds(obs_file, model_file):
128
140
  [
129
141
  [-1, 0, 2, 3],
130
142
  [-1, 1, 2, 3],
131
- ]
143
+ ],
132
144
  )
133
145
  iwc = np.array(
134
146
  [
135
147
  [-1, 0, 2, 31],
136
148
  [-1, 1, 200, 3],
137
- ]
149
+ ],
138
150
  )
139
151
  lwc = np.array(
140
152
  [
141
153
  [0, 1, 2, 3],
142
154
  [0, 1, 2, 3],
143
- ]
155
+ ],
144
156
  )
145
157
  expected = np.array([31 / 3 * 1000, 200 / 2 * 1000])
146
158
  x, _ = adv_pro.find_ice_in_clouds(cf_f, iwc, lwc)
147
159
  testing.assert_array_almost_equal(x, expected)
148
160
 
149
161
 
150
- def test_get_ice_indices(obs_file, model_file):
162
+ def test_get_ice_indices(obs_file, model_file) -> None:
151
163
  obs = ObservationManager(PRODUCT, str(obs_file))
152
164
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
153
165
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -155,19 +167,19 @@ def test_get_ice_indices(obs_file, model_file):
155
167
  [
156
168
  [-1, 0, 2, 3],
157
169
  [-1, 1, 2, 3],
158
- ]
170
+ ],
159
171
  )
160
172
  iwc = np.array(
161
173
  [
162
174
  [-1, 0, 2, 31],
163
175
  [-1, 1, 200, 3],
164
- ]
176
+ ],
165
177
  )
166
178
  lwc = np.array(
167
179
  [
168
180
  [0, 1, 2, 3],
169
181
  [0, 1, 2, 3],
170
- ]
182
+ ],
171
183
  )
172
184
  x = np.array([0, 1])
173
185
  y = np.array([3, 2])
@@ -176,7 +188,7 @@ def test_get_ice_indices(obs_file, model_file):
176
188
  testing.assert_array_almost_equal(result, expected)
177
189
 
178
190
 
179
- def test_iwc_variance(obs_file, model_file):
191
+ def test_iwc_variance(obs_file, model_file) -> None:
180
192
  obs = ObservationManager(PRODUCT, str(obs_file))
181
193
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
182
194
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -188,7 +200,7 @@ def test_iwc_variance(obs_file, model_file):
188
200
  assert len(x) == 3
189
201
 
190
202
 
191
- def test_calculate_variance_iwc(obs_file, model_file):
203
+ def test_calculate_variance_iwc(obs_file, model_file) -> None:
192
204
  obs = ObservationManager(PRODUCT, str(obs_file))
193
205
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
194
206
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -200,7 +212,7 @@ def test_calculate_variance_iwc(obs_file, model_file):
200
212
  testing.assert_array_almost_equal(x, compare)
201
213
 
202
214
 
203
- def test_calculate_wind_shear(obs_file, model_file):
215
+ def test_calculate_wind_shear(obs_file, model_file) -> None:
204
216
  obs = ObservationManager(PRODUCT, str(obs_file))
205
217
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
206
218
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -213,7 +225,7 @@ def test_calculate_wind_shear(obs_file, model_file):
213
225
  testing.assert_array_almost_equal(np.round(x, 2), compare)
214
226
 
215
227
 
216
- def test_calculate_iwc_distribution(obs_file, model_file):
228
+ def test_calculate_iwc_distribution(obs_file, model_file) -> None:
217
229
  obs = ObservationManager(PRODUCT, str(obs_file))
218
230
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
219
231
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -227,7 +239,7 @@ def test_calculate_iwc_distribution(obs_file, model_file):
227
239
  testing.assert_array_almost_equal(x, compare)
228
240
 
229
241
 
230
- def test_gamma_distribution(obs_file, model_file):
242
+ def test_gamma_distribution(obs_file, model_file) -> None:
231
243
  obs = ObservationManager(PRODUCT, str(obs_file))
232
244
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
233
245
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)
@@ -248,26 +260,7 @@ def test_gamma_distribution(obs_file, model_file):
248
260
  testing.assert_array_almost_equal(x, compare)
249
261
 
250
262
 
251
- def test_get_observation_index(obs_file, model_file):
252
- obs = ObservationManager(PRODUCT, str(obs_file))
253
- model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
254
- adv_pro = AdvanceProductMethods(model, str(model_file), obs)
255
- tZT = 0.01
256
- z_sen = 0.02
257
- temperature = -13
258
- tT = 0.04
259
- tZ = 0.05
260
- t = 0.06
261
- min_iwc = 10 ** (tZT * z_sen * temperature + tT * temperature + tZ * z_sen + t)
262
- iwc_dist = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
263
- compare = iwc_dist > min_iwc
264
- x = adv_pro.get_observation_index(
265
- iwc_dist, tZT, tT, tZ, np.array([t]), temperature, z_sen
266
- )
267
- testing.assert_array_almost_equal(x, compare)
268
-
269
-
270
- def test_filter_cirrus(obs_file, model_file):
263
+ def test_filter_cirrus(obs_file, model_file) -> None:
271
264
  obs = ObservationManager(PRODUCT, str(obs_file))
272
265
  model = ModelManager(str(model_file), MODEL, OUTPUT_FILE, PRODUCT)
273
266
  adv_pro = AdvanceProductMethods(model, str(model_file), obs)