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.
- cloudnetpy/categorize/__init__.py +1 -2
- cloudnetpy/categorize/atmos_utils.py +297 -67
- cloudnetpy/categorize/attenuation.py +31 -0
- cloudnetpy/categorize/attenuations/__init__.py +37 -0
- cloudnetpy/categorize/attenuations/gas_attenuation.py +30 -0
- cloudnetpy/categorize/attenuations/liquid_attenuation.py +84 -0
- cloudnetpy/categorize/attenuations/melting_attenuation.py +78 -0
- cloudnetpy/categorize/attenuations/rain_attenuation.py +84 -0
- cloudnetpy/categorize/categorize.py +332 -156
- cloudnetpy/categorize/classify.py +127 -125
- cloudnetpy/categorize/containers.py +107 -76
- cloudnetpy/categorize/disdrometer.py +40 -0
- cloudnetpy/categorize/droplet.py +23 -21
- cloudnetpy/categorize/falling.py +53 -24
- cloudnetpy/categorize/freezing.py +25 -12
- cloudnetpy/categorize/insects.py +35 -23
- cloudnetpy/categorize/itu.py +243 -0
- cloudnetpy/categorize/lidar.py +36 -41
- cloudnetpy/categorize/melting.py +34 -26
- cloudnetpy/categorize/model.py +84 -37
- cloudnetpy/categorize/mwr.py +18 -14
- cloudnetpy/categorize/radar.py +215 -102
- cloudnetpy/cli.py +578 -0
- cloudnetpy/cloudnetarray.py +43 -89
- cloudnetpy/concat_lib.py +218 -78
- cloudnetpy/constants.py +28 -10
- cloudnetpy/datasource.py +61 -86
- cloudnetpy/exceptions.py +49 -20
- cloudnetpy/instruments/__init__.py +5 -0
- cloudnetpy/instruments/basta.py +29 -12
- cloudnetpy/instruments/bowtie.py +135 -0
- cloudnetpy/instruments/ceilo.py +138 -115
- cloudnetpy/instruments/ceilometer.py +164 -80
- cloudnetpy/instruments/cl61d.py +21 -5
- cloudnetpy/instruments/cloudnet_instrument.py +74 -36
- cloudnetpy/instruments/copernicus.py +108 -30
- cloudnetpy/instruments/da10.py +54 -0
- cloudnetpy/instruments/disdrometer/common.py +126 -223
- cloudnetpy/instruments/disdrometer/parsivel.py +453 -94
- cloudnetpy/instruments/disdrometer/thies.py +254 -87
- cloudnetpy/instruments/fd12p.py +201 -0
- cloudnetpy/instruments/galileo.py +65 -23
- cloudnetpy/instruments/hatpro.py +123 -49
- cloudnetpy/instruments/instruments.py +113 -1
- cloudnetpy/instruments/lufft.py +39 -17
- cloudnetpy/instruments/mira.py +268 -61
- cloudnetpy/instruments/mrr.py +187 -0
- cloudnetpy/instruments/nc_lidar.py +19 -8
- cloudnetpy/instruments/nc_radar.py +109 -55
- cloudnetpy/instruments/pollyxt.py +135 -51
- cloudnetpy/instruments/radiometrics.py +313 -59
- cloudnetpy/instruments/rain_e_h3.py +171 -0
- cloudnetpy/instruments/rpg.py +321 -189
- cloudnetpy/instruments/rpg_reader.py +74 -40
- cloudnetpy/instruments/toa5.py +49 -0
- cloudnetpy/instruments/vaisala.py +95 -343
- cloudnetpy/instruments/weather_station.py +774 -105
- cloudnetpy/metadata.py +90 -19
- cloudnetpy/model_evaluation/file_handler.py +55 -52
- cloudnetpy/model_evaluation/metadata.py +46 -20
- cloudnetpy/model_evaluation/model_metadata.py +1 -1
- cloudnetpy/model_evaluation/plotting/plot_tools.py +32 -37
- cloudnetpy/model_evaluation/plotting/plotting.py +327 -117
- cloudnetpy/model_evaluation/products/advance_methods.py +92 -83
- cloudnetpy/model_evaluation/products/grid_methods.py +88 -63
- cloudnetpy/model_evaluation/products/model_products.py +43 -35
- cloudnetpy/model_evaluation/products/observation_products.py +41 -35
- cloudnetpy/model_evaluation/products/product_resampling.py +17 -7
- cloudnetpy/model_evaluation/products/tools.py +29 -20
- cloudnetpy/model_evaluation/statistics/statistical_methods.py +30 -20
- cloudnetpy/model_evaluation/tests/e2e/conftest.py +3 -3
- cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +9 -5
- cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +15 -14
- cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +9 -5
- cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +15 -14
- cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +9 -5
- cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +15 -14
- cloudnetpy/model_evaluation/tests/unit/conftest.py +42 -41
- cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +41 -48
- cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +216 -194
- cloudnetpy/model_evaluation/tests/unit/test_model_products.py +23 -21
- cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +37 -38
- cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +43 -40
- cloudnetpy/model_evaluation/tests/unit/test_plotting.py +30 -36
- cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +68 -31
- cloudnetpy/model_evaluation/tests/unit/test_tools.py +33 -26
- cloudnetpy/model_evaluation/utils.py +2 -1
- cloudnetpy/output.py +170 -111
- cloudnetpy/plotting/__init__.py +2 -1
- cloudnetpy/plotting/plot_meta.py +562 -822
- cloudnetpy/plotting/plotting.py +1142 -704
- cloudnetpy/products/__init__.py +1 -0
- cloudnetpy/products/classification.py +370 -88
- cloudnetpy/products/der.py +85 -55
- cloudnetpy/products/drizzle.py +77 -34
- cloudnetpy/products/drizzle_error.py +15 -11
- cloudnetpy/products/drizzle_tools.py +79 -59
- cloudnetpy/products/epsilon.py +211 -0
- cloudnetpy/products/ier.py +27 -50
- cloudnetpy/products/iwc.py +55 -48
- cloudnetpy/products/lwc.py +96 -70
- cloudnetpy/products/mwr_tools.py +186 -0
- cloudnetpy/products/product_tools.py +170 -128
- cloudnetpy/utils.py +455 -240
- cloudnetpy/version.py +2 -2
- {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info}/METADATA +44 -40
- cloudnetpy-1.87.3.dist-info/RECORD +127 -0
- {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info}/WHEEL +1 -1
- cloudnetpy-1.87.3.dist-info/entry_points.txt +2 -0
- docs/source/conf.py +2 -2
- cloudnetpy/categorize/atmos.py +0 -361
- cloudnetpy/products/mwr_multi.py +0 -68
- cloudnetpy/products/mwr_single.py +0 -75
- cloudnetpy-1.49.9.dist-info/RECORD +0 -112
- {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info/licenses}/LICENSE +0 -0
- {cloudnetpy-1.49.9.dist-info → cloudnetpy-1.87.3.dist-info}/top_level.txt +0 -0
cloudnetpy/products/ier.py
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
"""Module for creating Cloudnet ice effective radius file using Z-T method."""
|
|
2
|
+
|
|
3
|
+
from os import PathLike
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
2
6
|
import numpy as np
|
|
3
7
|
from numpy import ma
|
|
4
8
|
|
|
5
|
-
from cloudnetpy import constants, output
|
|
9
|
+
from cloudnetpy import constants, output
|
|
6
10
|
from cloudnetpy.metadata import MetaData
|
|
11
|
+
from cloudnetpy.products.iwc import DEFINITIONS as IWC_DEFINITION
|
|
7
12
|
from cloudnetpy.products.product_tools import IceClassification, IceSource
|
|
13
|
+
from cloudnetpy.utils import get_uuid
|
|
8
14
|
|
|
9
15
|
|
|
10
16
|
def generate_ier(
|
|
11
|
-
categorize_file: str
|
|
12
|
-
|
|
17
|
+
categorize_file: str | PathLike,
|
|
18
|
+
output_file: str | PathLike,
|
|
19
|
+
uuid: str | UUID | None = None,
|
|
20
|
+
) -> UUID:
|
|
13
21
|
"""Generates Cloudnet ice effective radius product.
|
|
14
22
|
|
|
15
23
|
This function calculates ice particle effective radius using the Grieche
|
|
@@ -51,41 +59,39 @@ def generate_ier(
|
|
|
51
59
|
from https://doi.org/10.5194/amt-13-5335-2020,
|
|
52
60
|
|
|
53
61
|
"""
|
|
62
|
+
uuid = get_uuid(uuid)
|
|
54
63
|
product = "ier"
|
|
55
64
|
with IerSource(categorize_file, product) as ier_source:
|
|
56
65
|
ice_classification = IceClassification(categorize_file)
|
|
57
|
-
ier_source.
|
|
58
|
-
ier_source.append_main_variable(ice_classification)
|
|
66
|
+
ier_source.append_icy_data(ice_classification)
|
|
59
67
|
ier_source.convert_units()
|
|
60
68
|
ier_source.append_status(ice_classification)
|
|
61
|
-
ier_source.append_ier_error(
|
|
69
|
+
ier_source.append_ier_error()
|
|
62
70
|
date = ier_source.get_date()
|
|
63
71
|
attributes = output.add_time_attribute(IER_ATTRIBUTES, date)
|
|
64
72
|
attributes = _add_ier_comment(attributes, ier_source)
|
|
65
73
|
output.update_attributes(ier_source.data, attributes)
|
|
66
|
-
|
|
67
|
-
|
|
74
|
+
output.save_product_file(product, ier_source, output_file, uuid)
|
|
75
|
+
return uuid
|
|
68
76
|
|
|
69
77
|
|
|
70
78
|
class IerSource(IceSource):
|
|
71
79
|
"""Data container for ice effective radius calculations."""
|
|
72
80
|
|
|
73
|
-
def convert_units(self):
|
|
81
|
+
def convert_units(self) -> None:
|
|
74
82
|
"""Convert um to m."""
|
|
75
|
-
|
|
76
|
-
self.data[prod].data[:] /= 1e6
|
|
83
|
+
self.data["ier"].data[:] /= 1e6
|
|
77
84
|
|
|
78
|
-
def append_ier_error(self
|
|
79
|
-
error = ma.copy(self.data[f"{self.product}
|
|
80
|
-
error[ice_classification.ice_above_rain] = ma.masked
|
|
85
|
+
def append_ier_error(self) -> None:
|
|
86
|
+
error = ma.copy(self.data[f"{self.product}"][:])
|
|
81
87
|
error = error * np.sqrt(0.4**2 + 0.4**2)
|
|
82
88
|
self.append_data(error, f"{self.product}_error")
|
|
83
89
|
|
|
84
90
|
|
|
85
91
|
def _add_ier_comment(attributes: dict, ier: IerSource) -> dict:
|
|
86
|
-
freq =
|
|
92
|
+
freq = round(ier.radar_frequency, 3)
|
|
87
93
|
coeffs = ier.coefficients
|
|
88
|
-
factor =
|
|
94
|
+
factor = round(coeffs[0] / 0.93, 3)
|
|
89
95
|
attributes["ier"] = attributes["ier"]._replace(
|
|
90
96
|
comment=f"This variable was calculated from the {freq}-GHz radar\n"
|
|
91
97
|
f"reflectivity factor after correction for gaseous attenuation,\n"
|
|
@@ -103,9 +109,7 @@ def _add_ier_comment(attributes: dict, ier: IerSource) -> dict:
|
|
|
103
109
|
"data has diagnosed that the radar echo is due to ice, but note\n"
|
|
104
110
|
"that in some cases supercooled drizzle will erroneously be identified\n"
|
|
105
111
|
"as ice. Missing data indicates either that ice cloud was present but it was\n"
|
|
106
|
-
"only detected by the lidar so its ice water content could not be estimated
|
|
107
|
-
"or than there was rain below the ice associated with uncertain attenuation\n"
|
|
108
|
-
"of the reflectivities in the ice.\n"
|
|
112
|
+
"only detected by the lidar so its ice water content could not be estimated."
|
|
109
113
|
)
|
|
110
114
|
return attributes
|
|
111
115
|
|
|
@@ -120,55 +124,28 @@ COMMENTS = {
|
|
|
120
124
|
"This variable describes whether a retrieval was performed\n"
|
|
121
125
|
"for each pixel, and its associated quality."
|
|
122
126
|
),
|
|
123
|
-
"ier_inc_rain": (
|
|
124
|
-
"This variable is the same as ier but it also contains ier values\n"
|
|
125
|
-
"above rain. The ier values above rain have been severely affected\n"
|
|
126
|
-
"by attenuation and should be used when the effect of attenuation\n"
|
|
127
|
-
"is being studied."
|
|
128
|
-
),
|
|
129
127
|
}
|
|
130
128
|
|
|
131
|
-
DEFINITIONS = {
|
|
132
|
-
"ier_retrieval_status": (
|
|
133
|
-
"\n"
|
|
134
|
-
"Value 0: No ice present.\n"
|
|
135
|
-
"Value 1: Reliable retrieval.\n"
|
|
136
|
-
"Value 2: Unreliable retrieval due to uncorrected attenuation from liquid\n"
|
|
137
|
-
" water below the ice (no liquid water path measurement available).\n"
|
|
138
|
-
"Value 3: Retrieval performed but radar corrected for liquid attenuation\n"
|
|
139
|
-
" using radiometer liquid water path which is not always accurate.\n"
|
|
140
|
-
"Value 4: Ice detected only by the lidar.\n"
|
|
141
|
-
"Value 5: Ice detected by radar but rain below so no retrieval performed\n"
|
|
142
|
-
" due to very uncertain attenuation.\n"
|
|
143
|
-
"Value 6: Clear sky above rain wet-bulb temperature less than 0degC: if\n"
|
|
144
|
-
" rain attenuation were strong then ice could be present but\n"
|
|
145
|
-
" undetected."
|
|
146
|
-
"Value 7: Drizzle or rain that would have been classified as ice if\n"
|
|
147
|
-
" the wet-bulb temperature were less than 0degC: may be ice\n"
|
|
148
|
-
" if temperature is in error."
|
|
149
|
-
),
|
|
150
|
-
}
|
|
129
|
+
DEFINITIONS = {"ier_retrieval_status": IWC_DEFINITION["iwc_retrieval_status"]}
|
|
151
130
|
|
|
152
131
|
IER_ATTRIBUTES = {
|
|
153
132
|
"ier": MetaData(
|
|
154
133
|
long_name="Ice effective radius",
|
|
155
134
|
units="m",
|
|
156
135
|
ancillary_variables="ier_error",
|
|
157
|
-
|
|
158
|
-
"ier_inc_rain": MetaData(
|
|
159
|
-
long_name="Ice effective radius including rain",
|
|
160
|
-
units="m",
|
|
161
|
-
comment=COMMENTS["ier_inc_rain"],
|
|
136
|
+
dimensions=("time", "height"),
|
|
162
137
|
),
|
|
163
138
|
"ier_error": MetaData(
|
|
164
139
|
long_name="Random error in ice effective radius",
|
|
165
140
|
units="m",
|
|
166
141
|
comment=COMMENTS["ier_error"],
|
|
142
|
+
dimensions=("time", "height"),
|
|
167
143
|
),
|
|
168
144
|
"ier_retrieval_status": MetaData(
|
|
169
145
|
long_name="Ice effective radius retrieval status",
|
|
170
146
|
comment=COMMENTS["ier_retrieval_status"],
|
|
171
147
|
definition=DEFINITIONS["ier_retrieval_status"],
|
|
172
148
|
units="1",
|
|
149
|
+
dimensions=("time", "height"),
|
|
173
150
|
),
|
|
174
151
|
}
|
cloudnetpy/products/iwc.py
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
"""Module for creating Cloudnet ice water content file using Z-T method."""
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
from os import PathLike
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
import numpy.typing as npt
|
|
3
7
|
from numpy import ma
|
|
4
8
|
|
|
5
9
|
from cloudnetpy import output, utils
|
|
10
|
+
from cloudnetpy.constants import G_TO_KG
|
|
6
11
|
from cloudnetpy.metadata import MetaData
|
|
7
12
|
from cloudnetpy.products.product_tools import IceClassification, IceSource
|
|
8
13
|
|
|
9
14
|
|
|
10
15
|
def generate_iwc(
|
|
11
|
-
categorize_file: str
|
|
12
|
-
|
|
16
|
+
categorize_file: str | PathLike,
|
|
17
|
+
output_file: str | PathLike,
|
|
18
|
+
uuid: str | UUID | None = None,
|
|
19
|
+
) -> UUID:
|
|
13
20
|
"""Generates Cloudnet ice water content product.
|
|
14
21
|
|
|
15
22
|
This function calculates ice water content using the so-called Z-T method.
|
|
@@ -36,11 +43,11 @@ def generate_iwc(
|
|
|
36
43
|
J. Appl. Meteor. Climatol., 45, 301–317, https://doi.org/10.1175/JAM2340.1
|
|
37
44
|
|
|
38
45
|
"""
|
|
46
|
+
uuid = utils.get_uuid(uuid)
|
|
39
47
|
product = "iwc"
|
|
40
48
|
with IwcSource(categorize_file, product) as iwc_source:
|
|
41
49
|
ice_classification = IceClassification(categorize_file)
|
|
42
|
-
iwc_source.
|
|
43
|
-
iwc_source.append_main_variable(ice_classification)
|
|
50
|
+
iwc_source.append_icy_data(ice_classification)
|
|
44
51
|
iwc_source.append_bias()
|
|
45
52
|
iwc_source.append_sensitivity()
|
|
46
53
|
lwp_prior, bias = iwc_source.append_error(ice_classification)
|
|
@@ -50,8 +57,8 @@ def generate_iwc(
|
|
|
50
57
|
attributes = _add_iwc_comment(attributes, iwc_source)
|
|
51
58
|
attributes = _add_iwc_error_comment(attributes, lwp_prior, bias)
|
|
52
59
|
output.update_attributes(iwc_source.data, attributes)
|
|
53
|
-
|
|
54
|
-
|
|
60
|
+
output.save_product_file(product, iwc_source, output_file, uuid)
|
|
61
|
+
return uuid
|
|
55
62
|
|
|
56
63
|
|
|
57
64
|
class IwcSource(IceSource):
|
|
@@ -67,18 +74,20 @@ class IwcSource(IceSource):
|
|
|
67
74
|
bias = self.getvar("Z_bias") * self.coefficients.Z * 10
|
|
68
75
|
self.append_data(bias, f"{self.product}_bias")
|
|
69
76
|
|
|
70
|
-
def append_error(
|
|
77
|
+
def append_error(
|
|
78
|
+
self, ice_classification: IceClassification
|
|
79
|
+
) -> tuple[float, float]:
|
|
71
80
|
"""Estimates error of ice water content."""
|
|
72
81
|
|
|
73
|
-
def _calc_random_error() ->
|
|
82
|
+
def _calc_random_error() -> npt.NDArray:
|
|
74
83
|
scaled_temperature = self.coefficients.ZT * self.temperature
|
|
75
84
|
scaled_temperature += self.coefficients.Z
|
|
76
85
|
return self.getvar("Z_error") * scaled_temperature * 10
|
|
77
86
|
|
|
78
|
-
def _calc_error_in_uncorrected_ice() ->
|
|
87
|
+
def _calc_error_in_uncorrected_ice() -> float:
|
|
79
88
|
spec_liq_atten = 1.0 if self.wl_band == 0 else 4.5
|
|
80
89
|
liq_atten_scaled = spec_liq_atten * self.coefficients.Z
|
|
81
|
-
return lwp_prior *
|
|
90
|
+
return lwp_prior * G_TO_KG * liq_atten_scaled * 2 * 10
|
|
82
91
|
|
|
83
92
|
lwp_prior = 250 # g m-2
|
|
84
93
|
retrieval_uncertainty = 1.7 # dB
|
|
@@ -86,16 +95,19 @@ class IwcSource(IceSource):
|
|
|
86
95
|
error_uncorrected = _calc_error_in_uncorrected_ice()
|
|
87
96
|
iwc_error = utils.l2norm(retrieval_uncertainty, random_error)
|
|
88
97
|
iwc_error[ice_classification.uncorrected_ice] = utils.l2norm(
|
|
89
|
-
retrieval_uncertainty,
|
|
98
|
+
retrieval_uncertainty,
|
|
99
|
+
error_uncorrected,
|
|
100
|
+
)
|
|
101
|
+
iwc_error[~ice_classification.is_ice | ice_classification.uncorrected_ice] = (
|
|
102
|
+
ma.masked
|
|
90
103
|
)
|
|
91
|
-
iwc_error[
|
|
92
|
-
(~ice_classification.is_ice | ice_classification.ice_above_rain)
|
|
93
|
-
] = ma.masked
|
|
94
104
|
self.append_data(iwc_error, f"{self.product}_error")
|
|
95
105
|
return lwp_prior, retrieval_uncertainty
|
|
96
106
|
|
|
97
107
|
|
|
98
|
-
def _add_iwc_error_comment(
|
|
108
|
+
def _add_iwc_error_comment(
|
|
109
|
+
attributes: dict, lwp_prior: float, uncertainty: float
|
|
110
|
+
) -> dict:
|
|
99
111
|
attributes["iwc_error"] = attributes["iwc_error"]._replace(
|
|
100
112
|
comment="This variable is an estimate of the one-standard-deviation random\n"
|
|
101
113
|
"error in ice water content due to both the uncertainty of the retrieval\n"
|
|
@@ -104,15 +116,15 @@ def _add_iwc_error_comment(attributes: dict, lwp_prior, uncertainty: float) -> d
|
|
|
104
116
|
"present beneath the ice but no microwave radiometer data were available to\n"
|
|
105
117
|
"correct for the associated attenuation, the error also includes a\n"
|
|
106
118
|
f"contribution equivalent to approximately {lwp_prior} g m-2 of liquid water\n"
|
|
107
|
-
"path being uncorrected for."
|
|
119
|
+
"path being uncorrected for.",
|
|
108
120
|
)
|
|
109
121
|
return attributes
|
|
110
122
|
|
|
111
123
|
|
|
112
124
|
def _add_iwc_comment(attributes: dict, iwc: IwcSource) -> dict:
|
|
113
|
-
freq =
|
|
125
|
+
freq = round(iwc.radar_frequency, 3)
|
|
114
126
|
coeffs = iwc.coefficients
|
|
115
|
-
factor = round(
|
|
127
|
+
factor = round(coeffs[0] / 0.93, 3)
|
|
116
128
|
attributes["iwc"] = attributes["iwc"]._replace(
|
|
117
129
|
comment=f"This variable was calculated from the {freq}-GHz radar reflectivity\n"
|
|
118
130
|
"factor after correction for gaseous attenuation, and temperature taken from\n"
|
|
@@ -139,7 +151,7 @@ def _add_iwc_comment(attributes: dict, iwc: IwcSource) -> dict:
|
|
|
139
151
|
"and liquid cloud occurred below the ice, the retrieval was still performed\n"
|
|
140
152
|
"but its reliability is questionable due to the uncorrected liquid water\n"
|
|
141
153
|
"attenuation. This is indicated by a value of 2 in the iwc_retrieval_status\n"
|
|
142
|
-
"variable, and an increase in the value of the iwc_error variable."
|
|
154
|
+
"variable, and an increase in the value of the iwc_error variable.",
|
|
143
155
|
)
|
|
144
156
|
return attributes
|
|
145
157
|
|
|
@@ -158,32 +170,27 @@ COMMENTS = {
|
|
|
158
170
|
"This variable describes whether a retrieval was performed\n"
|
|
159
171
|
"for each pixel, and its associated quality."
|
|
160
172
|
),
|
|
161
|
-
"iwc_inc_rain": (
|
|
162
|
-
"This variable is the same as iwc but it also contains iwc values\n"
|
|
163
|
-
"above rain. The iwc values above rain have been severely affected\n"
|
|
164
|
-
"by attenuation and should be used when the effect of attenuation\n"
|
|
165
|
-
"is being studied."
|
|
166
|
-
),
|
|
167
173
|
}
|
|
168
174
|
|
|
169
175
|
DEFINITIONS = {
|
|
170
|
-
"iwc_retrieval_status": (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
176
|
+
"iwc_retrieval_status": utils.status_field_definition(
|
|
177
|
+
{
|
|
178
|
+
0: """No ice present.""",
|
|
179
|
+
1: """Reliable retrieval.""",
|
|
180
|
+
2: """Unreliable retrieval due to uncorrected liquid, rain or
|
|
181
|
+
melting attenuation.""",
|
|
182
|
+
3: """Retrieval performed with radar corrected for liquid, rain and
|
|
183
|
+
melting attenuation.""",
|
|
184
|
+
4: """Ice detected only by the lidar.""",
|
|
185
|
+
5: """Uncorrected rain attenuation (deprecated).""",
|
|
186
|
+
6: """Clear sky above rain and wet-bulb temperature less than 0degC:
|
|
187
|
+
if rain attenuation is strong, ice could be present but
|
|
188
|
+
undetected.""",
|
|
189
|
+
7: """Drizzle or rain that would have been classified as ice if the
|
|
190
|
+
wet-bulb temperature were less than 0degC: may be ice if
|
|
191
|
+
temperature is in error.""",
|
|
192
|
+
}
|
|
193
|
+
),
|
|
187
194
|
}
|
|
188
195
|
|
|
189
196
|
IWC_ATTRIBUTES = {
|
|
@@ -191,30 +198,30 @@ IWC_ATTRIBUTES = {
|
|
|
191
198
|
long_name="Ice water content",
|
|
192
199
|
units="kg m-3",
|
|
193
200
|
ancillary_variables="iwc_error iwc_sensitivity iwc_bias",
|
|
194
|
-
|
|
195
|
-
"iwc_inc_rain": MetaData(
|
|
196
|
-
long_name="Ice water content including rain",
|
|
197
|
-
units="kg m-3",
|
|
198
|
-
comment=COMMENTS["iwc_inc_rain"],
|
|
201
|
+
dimensions=("time", "height"),
|
|
199
202
|
),
|
|
200
203
|
"iwc_error": MetaData(
|
|
201
204
|
long_name="Random error in ice water content",
|
|
202
205
|
units="dB",
|
|
206
|
+
dimensions=("time", "height"),
|
|
203
207
|
),
|
|
204
208
|
"iwc_bias": MetaData(
|
|
205
209
|
long_name="Possible bias in ice water content",
|
|
206
210
|
units="dB",
|
|
207
211
|
comment=COMMENTS["iwc_bias"],
|
|
212
|
+
dimensions=None,
|
|
208
213
|
),
|
|
209
214
|
"iwc_sensitivity": MetaData(
|
|
210
215
|
long_name="Minimum detectable ice water content",
|
|
211
216
|
units="kg m-3",
|
|
212
217
|
comment=COMMENTS["iwc_sensitivity"],
|
|
218
|
+
dimensions=("height",),
|
|
213
219
|
),
|
|
214
220
|
"iwc_retrieval_status": MetaData(
|
|
215
221
|
long_name="Ice water content retrieval status",
|
|
216
222
|
comment=COMMENTS["iwc_retrieval_status"],
|
|
217
223
|
definition=DEFINITIONS["iwc_retrieval_status"],
|
|
218
224
|
units="1",
|
|
225
|
+
dimensions=("time", "height"),
|
|
219
226
|
),
|
|
220
227
|
}
|