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
@@ -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, utils
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, output_file: str, uuid: str | None = None
12
- ) -> str:
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.append_main_variable_including_rain(ice_classification)
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(ice_classification)
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
- uuid = output.save_product_file(product, ier_source, output_file, uuid)
67
- return uuid
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
- for prod in ("ier", "ier_inc_rain"):
76
- self.data[prod].data[:] /= 1e6
83
+ self.data["ier"].data[:] /= 1e6
77
84
 
78
- def append_ier_error(self, ice_classification: IceClassification) -> None:
79
- error = ma.copy(self.data[f"{self.product}_inc_rain"][:])
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 = utils.get_frequency(ier.wl_band)
92
+ freq = round(ier.radar_frequency, 3)
87
93
  coeffs = ier.coefficients
88
- factor = np.round((coeffs[0] / 0.93), 3)
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,\n"
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
  }
@@ -1,15 +1,22 @@
1
1
  """Module for creating Cloudnet ice water content file using Z-T method."""
2
- import numpy as np
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, output_file: str, uuid: str | None = None
12
- ) -> str:
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.append_main_variable_including_rain(ice_classification)
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
- uuid = output.save_product_file(product, iwc_source, output_file, uuid)
54
- return uuid
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(self, ice_classification: IceClassification) -> tuple:
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() -> np.ndarray:
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() -> np.ndarray:
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 * liq_atten_scaled * 2 * 1e-3 * 10
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, error_uncorrected
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(attributes: dict, lwp_prior, uncertainty: float) -> dict:
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 = utils.get_frequency(iwc.wl_band)
125
+ freq = round(iwc.radar_frequency, 3)
114
126
  coeffs = iwc.coefficients
115
- factor = round((coeffs[0] / 0.93) * 1000) / 1000
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
- "\n"
172
- "Value 0: No ice present.\n"
173
- "Value 1: Reliable retrieval.\n"
174
- "Value 2: Unreliable retrieval due to uncorrected attenuation from liquid\n"
175
- " water below the ice (no liquid water path measurement available).\n"
176
- "Value 3: Retrieval performed but radar corrected for liquid attenuation\n"
177
- " using radiometer liquid water path which is not always accurate.\n"
178
- "Value 4: Ice detected only by the lidar.\n"
179
- "Value 5: Ice detected by radar but rain below so no retrieval performed\n"
180
- " due to very uncertain attenuation.\n"
181
- "Value 6: Clear sky above rain and wet-bulb temperature less than 0degC:\n"
182
- " if rain attenuation is strong, ice could be present but undetected.\n"
183
- "Value 7: Drizzle or rain that would have been classified as ice if the\n"
184
- " wet-bulb temperature were less than 0degC: may be ice if\n"
185
- " temperature is in error."
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
  }