cloudnetpy 1.61.7__py3-none-any.whl → 1.61.8__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.
@@ -289,33 +289,38 @@ COMMENTS = {
289
289
  }
290
290
 
291
291
  DEFINITIONS = {
292
- "category_bits": (
293
- "\n"
294
- "Bit 0: Small liquid droplets are present.\n"
295
- "Bit 1: Falling hydrometeors are present; if Bit 2 is set then these are most\n"
296
- " likely ice particles, otherwise they are drizzle or rain drops.\n"
297
- "Bit 2: Wet-bulb temperature is less than 0 degrees C, implying the phase of\n"
298
- " Bit-1 particles.\n"
299
- "Bit 3: Melting ice particles are present.\n"
300
- "Bit 4: Aerosol particles are present and visible to the lidar.\n"
301
- "Bit 5: Insects are present and visible to the radar."
292
+ "category_bits": utils.bit_field_definition(
293
+ {
294
+ 0: """Small liquid droplets are present.""",
295
+ 1: """Falling hydrometeors are present; if Bit 2 is set then these
296
+ are most likely ice particles, otherwise they are drizzle or
297
+ rain drops.""",
298
+ 2: """Wet-bulb temperature is less than 0 degrees C, implying the
299
+ phase of Bit-1 particles.""",
300
+ 3: """Melting ice particles are present.""",
301
+ 4: """Aerosol particles are present and visible to the lidar.""",
302
+ 5: """Insects are present and visible to the radar.""",
303
+ }
302
304
  ),
303
- "quality_bits": (
304
- "\n"
305
- "Bit 0: An echo is detected by the radar.\n"
306
- "Bit 1: An echo is detected by the lidar.\n"
307
- "Bit 2: The apparent echo detected by the radar is ground clutter or some\n"
308
- " other non-atmospheric artifact.\n"
309
- "Bit 3: The lidar echo is due to clear-air molecular scattering.\n"
310
- "Bit 4: Liquid water cloud, rainfall or melting ice below this pixel\n"
311
- " will have caused radar and lidar attenuation; if bit 5 is set then\n"
312
- " a correction for the radar attenuation has been performed;\n"
313
- " otherwise do not trust the absolute values of reflectivity factor.\n"
314
- " No correction is performed for lidar attenuation.\n"
315
- "Bit 5: Radar reflectivity has been corrected for liquid-water attenuation\n"
316
- " using the microwave radiometer measurements of liquid water path\n"
317
- " and the lidar estimation of the location of liquid water cloud;\n"
318
- " be aware that errors in reflectivity may result.\n"
305
+ "quality_bits": utils.bit_field_definition(
306
+ {
307
+ 0: """An echo is detected by the radar.""",
308
+ 1: """An echo is detected by the lidar.""",
309
+ 2: """The apparent echo detected by the radar is ground clutter or
310
+ some other non-atmospheric artifact.""",
311
+ 3: """The lidar echo is due to clear-air molecular scattering.""",
312
+ 4: """Liquid water cloud, rainfall or melting ice below this pixel
313
+ will have caused radar and lidar attenuation; if bit 5 is set
314
+ then a correction for the radar attenuation has been
315
+ performed; otherwise do not trust the absolute values of
316
+ reflectivity factor. No correction is performed for lidar
317
+ attenuation.""",
318
+ 5: """Radar reflectivity has been corrected for liquid-water
319
+ attenuation using the microwave radiometer measurements of
320
+ liquid water path and the lidar estimation of the location of
321
+ liquid water cloud; be aware that errors in reflectivity may
322
+ result.""",
323
+ }
319
324
  ),
320
325
  }
321
326
 
@@ -4,7 +4,7 @@ from itertools import islice
4
4
  import netCDF4
5
5
  from numpy import ma
6
6
 
7
- from cloudnetpy import output
7
+ from cloudnetpy import output, utils
8
8
  from cloudnetpy.instruments.campbell_scientific import Cs135
9
9
  from cloudnetpy.instruments.cl61d import Cl61d
10
10
  from cloudnetpy.instruments.lufft import LufftCeilo
@@ -225,11 +225,12 @@ ATTRIBUTES = {
225
225
  "warning": MetaData(
226
226
  long_name="Warning and Alarm flag",
227
227
  units="1",
228
- definition=(
229
- "\n"
230
- "Value 0: Self-check OK\n"
231
- "Value W: At least one warning on\n"
232
- "Value A: At least one error active."
228
+ definition=utils.status_field_definition(
229
+ {
230
+ "0": "Self-check OK",
231
+ "W": "At least one warning on",
232
+ "A": "At least one error active.",
233
+ }
233
234
  ),
234
235
  ),
235
236
  "warning_flags": MetaData(
@@ -346,30 +346,37 @@ def _filter_zenith_angle(zenith: ma.MaskedArray) -> np.ndarray:
346
346
 
347
347
 
348
348
  DEFINITIONS = {
349
- "model_number": "\n"
350
- "0: Single polarisation radar.\n"
351
- "1: Dual polarisation radar.",
352
- "dual_polarization": (
353
- "\n"
354
- "Value 0: Single polarisation radar.\n"
355
- "Value 1: Dual polarisation radar in linear depolarisation ratio (LDR) mode.\n"
356
- "Value 2: Dual polarisation radar in simultaneous transmission simultaneous\n"
357
- "reception (STSR) mode."
358
- ),
359
- "FFT_window": (
360
- "\n"
361
- "Value 0: Square\n"
362
- "Value 1: Parzen\n"
363
- "Value 2: Blackman\n"
364
- "Value 3: Welch\n"
365
- "Value 4: Slepian2\n"
366
- "Value 5: Slepian3"
367
- ),
368
- "quality_flag": (
369
- "\n"
370
- "Bit 0: ADC saturation.\n"
371
- "Bit 1: Spectral width too high.\n"
372
- "Bit 2: No transmission power levelling."
349
+ "model_number": utils.status_field_definition(
350
+ {
351
+ 0: "Single polarisation radar.",
352
+ 1: "Dual polarisation radar.",
353
+ }
354
+ ),
355
+ "dual_polarization": utils.status_field_definition(
356
+ {
357
+ 0: """Single polarisation radar.""",
358
+ 1: """Dual polarisation radar in linear depolarisation ratio (LDR)
359
+ mode.""",
360
+ 2: """Dual polarisation radar in simultaneous transmission
361
+ simultaneous reception (STSR) mode.""",
362
+ }
363
+ ),
364
+ "FFT_window": utils.status_field_definition(
365
+ {
366
+ 0: "Square",
367
+ 1: "Parzen",
368
+ 2: "Blackman",
369
+ 3: "Welch",
370
+ 4: "Slepian2",
371
+ 5: "Slepian3",
372
+ }
373
+ ),
374
+ "quality_flag": utils.bit_field_definition(
375
+ {
376
+ 0: "ADC saturation.",
377
+ 1: "Spectral width too high.",
378
+ 2: "No transmission power levelling.",
379
+ }
373
380
  ),
374
381
  }
375
382
 
@@ -54,10 +54,13 @@ class VaisalaCeilo(Ceilometer):
54
54
  def _read_backscatter(self, lines: list) -> np.ndarray:
55
55
  """Converts backscatter profile from 2-complement hex to floats."""
56
56
  n_chars = self._hex_conversion_params[0]
57
- n_gates = int(len(lines[0]) / n_chars)
57
+ n_gates = len(self.data["range"])
58
58
  profiles = np.zeros((len(lines), n_gates), dtype=int)
59
59
  ran = range(0, n_gates * n_chars, n_chars)
60
60
  for ind, line in enumerate(lines):
61
+ if int(len(line) / n_chars) != n_gates:
62
+ logging.warning("Invalid line in raw ceilometer data")
63
+ continue
61
64
  try:
62
65
  profiles[ind, :] = [int(line[i : i + n_chars], 16) for i in ran]
63
66
  except ValueError:
@@ -2,7 +2,7 @@
2
2
  import numpy as np
3
3
  from numpy import ma
4
4
 
5
- from cloudnetpy import output
5
+ from cloudnetpy import output, utils
6
6
  from cloudnetpy.categorize import atmos
7
7
  from cloudnetpy.datasource import DataSource
8
8
  from cloudnetpy.metadata import MetaData
@@ -140,35 +140,38 @@ COMMENTS = {
140
140
  }
141
141
 
142
142
  DEFINITIONS = {
143
- "target_classification": (
144
- "\n"
145
- "Value 0: Clear sky.\n"
146
- "Value 1: Cloud liquid droplets only.\n"
147
- "Value 2: Drizzle or rain.\n"
148
- "Value 3: Drizzle or rain coexisting with cloud liquid droplets.\n"
149
- "Value 4: Ice particles.\n"
150
- "Value 5: Ice coexisting with supercooled liquid droplets.\n"
151
- "Value 6: Melting ice particles.\n"
152
- "Value 7: Melting ice particles coexisting with cloud liquid droplets.\n"
153
- "Value 8: Aerosol particles, no cloud or precipitation.\n"
154
- "Value 9: Insects, no cloud or precipitation.\n"
155
- "Value 10: Aerosol coexisting with insects, no cloud or precipitation."
143
+ "target_classification": utils.status_field_definition(
144
+ {
145
+ 0: "Clear sky.",
146
+ 1: "Cloud liquid droplets only.",
147
+ 2: "Drizzle or rain.",
148
+ 3: "Drizzle or rain coexisting with cloud liquid droplets.",
149
+ 4: "Ice particles.",
150
+ 5: "Ice coexisting with supercooled liquid droplets.",
151
+ 6: "Melting ice particles.",
152
+ 7: "Melting ice particles coexisting with cloud liquid droplets.",
153
+ 8: "Aerosol particles, no cloud or precipitation.",
154
+ 9: "Insects, no cloud or precipitation.",
155
+ 10: "Aerosol coexisting with insects, no cloud or precipitation.",
156
+ }
156
157
  ),
157
- "detection_status": (
158
- "\n"
159
- "Value 0: Clear sky.\n"
160
- "Value 1: Lidar echo only.\n"
161
- "Value 2: Radar echo but reflectivity may be unreliable as attenuation\n"
162
- " by rain, melting ice or liquid cloud has not been corrected.\n"
163
- "Value 3: Good radar and lidar echos.\n"
164
- "Value 4: No radar echo but rain or liquid cloud beneath mean that\n"
165
- " attenuation that would be experienced is unknown.\n"
166
- "Value 5: Good radar echo only.\n"
167
- "Value 6: No radar echo but known attenuation.\n"
168
- "Value 7: Radar echo corrected for liquid attenuation using microwave\n"
169
- " radiometer data.\n"
170
- "Value 8: Radar ground clutter.\n"
171
- "Value 9: Lidar clear-air molecular scattering."
158
+ "detection_status": utils.status_field_definition(
159
+ {
160
+ 0: """Clear sky.""",
161
+ 1: """Lidar echo only.""",
162
+ 2: """Radar echo but reflectivity may be unreliable as attenuation
163
+ by rain, melting ice or liquid cloud has not been
164
+ corrected.""",
165
+ 3: """Good radar and lidar echos.""",
166
+ 4: """No radar echo but rain or liquid cloud beneath mean that
167
+ attenuation that would be experienced is unknown.""",
168
+ 5: """Good radar echo only.""",
169
+ 6: """No radar echo but known attenuation.""",
170
+ 7: """Radar echo corrected for liquid attenuation using microwave
171
+ radiometer data.""",
172
+ 8: """Radar ground clutter.""",
173
+ 9: """Lidar clear-air molecular scattering.""",
174
+ }
172
175
  ),
173
176
  }
174
177
 
@@ -225,16 +225,17 @@ class DerSource(DataSource):
225
225
 
226
226
 
227
227
  DEFINITIONS = {
228
- "der_retrieval_status": (
229
- "\n"
230
- "Value 0: No data: No cloud observed.\n"
231
- "Value 1: Reliable retrieval.\n"
232
- "Value 2: Mix of drops and ice: Droplets and ice crystals coexist within\n"
233
- "pixel. Z may be biased by large crystals.\n"
234
- "Value 3: Precipitation in profile: Drizzle and rain affects LWP retrieval\n"
235
- " of MWR but also the target reflectivity.\n"
236
- "Value 4: Surrounding ice: Less crucial! Ice crystals in the vicinity of a\n"
237
- " droplet pixel may also bias its reflectivity.\n"
228
+ "der_retrieval_status": utils.status_field_definition(
229
+ {
230
+ 0: """No data: No cloud observed.""",
231
+ 1: """Reliable retrieval.""",
232
+ 2: """Mix of drops and ice: Droplets and ice crystals coexist within
233
+ pixel. Z may be biased by large crystals.""",
234
+ 3: """Precipitation in profile: Drizzle and rain affects LWP
235
+ retrieval of MWR but also the target reflectivity.""",
236
+ 4: """Surrounding ice: Less crucial! Ice crystals in the vicinity of
237
+ a droplet pixel may also bias its reflectivity.""",
238
+ }
238
239
  ),
239
240
  }
240
241
 
@@ -130,23 +130,26 @@ COMMENTS = {
130
130
  }
131
131
 
132
132
  DEFINITIONS = {
133
- "ier_retrieval_status": (
134
- "\n"
135
- "Value 0: No ice present.\n"
136
- "Value 1: Reliable retrieval.\n"
137
- "Value 2: Unreliable retrieval due to uncorrected attenuation from liquid\n"
138
- " water below the ice (no liquid water path measurement available).\n"
139
- "Value 3: Retrieval performed but radar corrected for liquid attenuation\n"
140
- " using radiometer liquid water path which is not always accurate.\n"
141
- "Value 4: Ice detected only by the lidar.\n"
142
- "Value 5: Ice detected by radar but rain below so no retrieval performed\n"
143
- " due to very uncertain attenuation.\n"
144
- "Value 6: Clear sky above rain wet-bulb temperature less than 0degC: if\n"
145
- " rain attenuation were strong then ice could be present but\n"
146
- " undetected."
147
- "Value 7: Drizzle or rain that would have been classified as ice if\n"
148
- " the wet-bulb temperature were less than 0degC: may be ice\n"
149
- " if temperature is in error."
133
+ "ier_retrieval_status": utils.status_field_definition(
134
+ {
135
+ 0: """No ice present.""",
136
+ 1: """Reliable retrieval.""",
137
+ 2: """Unreliable retrieval due to uncorrected attenuation from
138
+ liquid water below the ice (no liquid water path measurement
139
+ available).""",
140
+ 3: """Retrieval performed but radar corrected for liquid attenuation
141
+ using radiometer liquid water path which is not always
142
+ accurate.""",
143
+ 4: """Ice detected only by the lidar.""",
144
+ 5: """Ice detected by radar but rain below so no retrieval performed
145
+ due to very uncertain attenuation.""",
146
+ 6: """Clear sky above rain wet-bulb temperature less than 0degC: if
147
+ rain attenuation were strong then ice could be present but
148
+ undetected.""",
149
+ 7: """Drizzle or rain that would have been classified as ice if the
150
+ wet-bulb temperature were less than 0degC: may be ice if
151
+ temperature is in error.""",
152
+ }
150
153
  ),
151
154
  }
152
155
 
@@ -170,22 +170,26 @@ COMMENTS = {
170
170
  }
171
171
 
172
172
  DEFINITIONS = {
173
- "iwc_retrieval_status": (
174
- "\n"
175
- "Value 0: No ice present.\n"
176
- "Value 1: Reliable retrieval.\n"
177
- "Value 2: Unreliable retrieval due to uncorrected attenuation from liquid\n"
178
- " water below the ice (no liquid water path measurement available).\n"
179
- "Value 3: Retrieval performed but radar corrected for liquid attenuation\n"
180
- " using radiometer liquid water path which is not always accurate.\n"
181
- "Value 4: Ice detected only by the lidar.\n"
182
- "Value 5: Ice detected by radar but rain below so no retrieval performed\n"
183
- " due to very uncertain attenuation.\n"
184
- "Value 6: Clear sky above rain and wet-bulb temperature less than 0degC:\n"
185
- " if rain attenuation is strong, ice could be present but undetected.\n"
186
- "Value 7: Drizzle or rain that would have been classified as ice if the\n"
187
- " wet-bulb temperature were less than 0degC: may be ice if\n"
188
- " temperature is in error."
173
+ "iwc_retrieval_status": utils.status_field_definition(
174
+ {
175
+ 0: """No ice present.""",
176
+ 1: """Reliable retrieval.""",
177
+ 2: """Unreliable retrieval due to uncorrected attenuation from
178
+ liquid water below the ice (no liquid water path measurement
179
+ available).""",
180
+ 3: """Retrieval performed but radar corrected for liquid attenuation
181
+ using radiometer liquid water path which is not always
182
+ accurate.""",
183
+ 4: """Ice detected only by the lidar.""",
184
+ 5: """Ice detected by radar but rain below so no retrieval performed
185
+ due to very uncertain attenuation.""",
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
+ }
189
193
  ),
190
194
  }
191
195
 
@@ -414,24 +414,25 @@ COMMENTS = {
414
414
  }
415
415
 
416
416
  DEFINITIONS = {
417
- "lwc_retrieval_status": (
418
- "\n"
419
- "Value 0: No liquid water detected.\n"
420
- "Value 1: Reliable retrieval.\n"
421
- "Value 2: Adiabatic retrieval where cloud top has been adjusted to match\n"
422
- " liquid water path from microwave radiometer because layer is not\n"
423
- " detected by radar."
424
- "Value 3: Adiabatic retrieval: new cloud pixels where cloud top has been\n"
425
- " adjusted to match liquid water path from microwave radiometer\n"
426
- " because layer is not detected by radar.\n"
427
- "Value 4: No retrieval: either no liquid water path is available or liquid\n"
428
- " water path is uncertain.\n"
429
- "Value 5: No retrieval: liquid water layer detected only by the lidar and\n"
430
- " liquid water path is unavailable or uncertain: cloud top may be\n"
431
- " higher than diagnosed cloud top since lidar signal has been\n"
432
- " attenuated."
433
- "Value 6: Rain present: cloud extent is difficult to ascertain and liquid\n"
434
- " water path also uncertain."
417
+ "lwc_retrieval_status": utils.status_field_definition(
418
+ {
419
+ 0: """No liquid water detected.""",
420
+ 1: """Reliable retrieval.""",
421
+ 2: """Adiabatic retrieval where cloud top has been adjusted to match
422
+ liquid water path from microwave radiometer because layer is
423
+ not detected by radar.""",
424
+ 3: """Adiabatic retrieval: new cloud pixels where cloud top has been
425
+ adjusted to match liquid water path from microwave radiometer
426
+ because layer is not detected by radar.""",
427
+ 4: """No retrieval: either no liquid water path is available or
428
+ liquid water path is uncertain.""",
429
+ 5: """No retrieval: liquid water layer detected only by the lidar
430
+ and liquid water path is unavailable or uncertain: cloud top
431
+ may be higher than diagnosed cloud top since lidar signal has
432
+ been attenuated.""",
433
+ 6: """Rain present: cloud extent is difficult to ascertain and
434
+ liquid water path also uncertain.""",
435
+ }
435
436
  ),
436
437
  }
437
438
 
cloudnetpy/utils.py CHANGED
@@ -3,11 +3,12 @@ import datetime
3
3
  import logging
4
4
  import os
5
5
  import re
6
+ import textwrap
6
7
  import uuid
7
8
  import warnings
8
9
  from collections.abc import Iterator
9
10
  from datetime import timezone
10
- from typing import Literal
11
+ from typing import Literal, TypeVar
11
12
 
12
13
  import netCDF4
13
14
  import numpy as np
@@ -995,3 +996,25 @@ def find_masked_profiles_indices(array: ma.MaskedArray) -> list:
995
996
  non_masked_counts = np.ma.count(array, axis=1)
996
997
  masked_profiles_indices = np.where(non_masked_counts == 0)[0]
997
998
  return list(masked_profiles_indices)
999
+
1000
+
1001
+ T = TypeVar("T", int, str)
1002
+
1003
+
1004
+ def _format_definition(kind: str, definitions: dict[T, str]) -> str:
1005
+ lines = [""]
1006
+ for key, value in definitions.items():
1007
+ prefix = f"{kind} {key}: "
1008
+ indent = " " * len(prefix)
1009
+ text = " ".join(value.split())
1010
+ wrapped = textwrap.wrap(prefix + text, subsequent_indent=indent)
1011
+ lines.extend(wrapped)
1012
+ return "\n".join(lines)
1013
+
1014
+
1015
+ def status_field_definition(definitions: dict[T, str]) -> str:
1016
+ return _format_definition("Value", definitions)
1017
+
1018
+
1019
+ def bit_field_definition(definitions: dict[T, str]) -> str:
1020
+ return _format_definition("Bit", definitions)
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 61
3
- PATCH = 7
3
+ PATCH = 8
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.61.7
3
+ Version: 1.61.8
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -7,12 +7,12 @@ cloudnetpy/exceptions.py,sha256=wrI0bZTwmS5C_cqOmvlJ8XJSEFyzuD1eD4voGJc_Gjg,1584
7
7
  cloudnetpy/metadata.py,sha256=v_VDo2vbdTxB0zIsfP69IcrwSKiRlLpsGdq6JPI4CoA,5306
8
8
  cloudnetpy/output.py,sha256=WoVTNuxni0DUr163vZ-_mDr1brXhY15XSlGMrq9Aoqw,14700
9
9
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- cloudnetpy/utils.py,sha256=DuUbtGJJTwEwrDxx6aLkos4qL-Lrdchnzjx4gv5dZiU,27814
11
- cloudnetpy/version.py,sha256=kTFWe1O0uMTPg6LtGazqdKp2KOo0w7j9KaWIUOArJx4,72
10
+ cloudnetpy/utils.py,sha256=-8x7LQ6WDHxf2lDZfhG50WYe2iSVLQObnVXZG46JzKI,28468
11
+ cloudnetpy/version.py,sha256=7PDpEj1po5am9CIPhurRGIIOfqJgJsvFLhUmiGRQQk4,72
12
12
  cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
13
13
  cloudnetpy/categorize/atmos.py,sha256=fWW8ye_8HZASRAiYwURFKWzcGOYIA2RKeVxCq0lVOuM,12389
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=wndpwJxc2-QnNTkV8tc8I11Vs_WkNz9sVMX1fuGgUC4,3777
15
- cloudnetpy/categorize/categorize.py,sha256=p3LLBXSu5AOMrJWwAZeS6J-Xzh4PkXuPmOCZiEHzt2w,17678
15
+ cloudnetpy/categorize/categorize.py,sha256=cIuspjg76h99Czf0XICpjflZGzmfyUH8LYGGgnbaBM8,17826
16
16
  cloudnetpy/categorize/classify.py,sha256=x7aqPfhw4xuER22sqOb9ES9nijwk1E8b7HF7uaFJD7k,9218
17
17
  cloudnetpy/categorize/containers.py,sha256=j6oSKPeZcq9vFthYaocAw1m6yReRNNPYUQF5UTDq4YM,4232
18
18
  cloudnetpy/categorize/disdrometer.py,sha256=daPB1JgERRqa0Ekxx_LYCP8mDe3XnUYj2VlsIKAB7sE,2003
@@ -28,7 +28,7 @@ cloudnetpy/categorize/radar.py,sha256=oaptBCymSPTa1HNYOWURnE0h5oklDOVxQvqAEAbqSQ
28
28
  cloudnetpy/instruments/__init__.py,sha256=_jejVwi_viSZehmAOkEqTNI-0-exGgAJ_bHW1IRRwTI,398
29
29
  cloudnetpy/instruments/basta.py,sha256=0zUztUJBXT2nrBTAl3-NLowxu_CYwTU5TgdBq4etj7E,3757
30
30
  cloudnetpy/instruments/campbell_scientific.py,sha256=2WHfBKQjtRSl0AqvtPeX7G8Hdi3Dn0WbvoAppFOMbA8,5270
31
- cloudnetpy/instruments/ceilo.py,sha256=56zhNSx5cyqV9ToeDUhXzwOUQK32oa9Vng2VsPXLsmM,8876
31
+ cloudnetpy/instruments/ceilo.py,sha256=ZDMrHHGYrboJMC2YMU9E1XsBAPI2eYoovrEsF1fUaRE,8922
32
32
  cloudnetpy/instruments/ceilometer.py,sha256=-aPEZs_r0Gxeu53PHeWAkZMB2BUdauS47tkL7RFxo6k,12078
33
33
  cloudnetpy/instruments/cl61d.py,sha256=ycJGvUqNU2KHhECbrSehtWRnvg1vKFHhvMeQpjpdCI4,1989
34
34
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=RG5HJxGM6p0F-IGyr85fvOizcMmgx48OeD_XeIsrgSU,3367
@@ -43,10 +43,10 @@ cloudnetpy/instruments/nc_lidar.py,sha256=Q4sJJwiEPthDz0Zb-laISX32jNYzlUBMafxLJi
43
43
  cloudnetpy/instruments/nc_radar.py,sha256=cDd20Yz-UeDQp1Gmkk-jGNZ45DangFsCaioeo_kktHQ,6935
44
44
  cloudnetpy/instruments/pollyxt.py,sha256=SccV9htZ5MWrK7JEleOr4hbmeTr-lKktUzAt7H9Xkf8,8932
45
45
  cloudnetpy/instruments/radiometrics.py,sha256=2ofeZ6KJ_JOWTd3UA-wSzJpM5cjN7R4jZeBLJCQKEYc,7624
46
- cloudnetpy/instruments/rpg.py,sha256=U8nEOlOI74f2lk2w4C4xKZCrW6AkDZpQZYE3yv7SNHE,17130
46
+ cloudnetpy/instruments/rpg.py,sha256=yQpcKcgzRvVvkl6NhKvo4PUkv9nZ69_hzzPpS2Ei-Is,17315
47
47
  cloudnetpy/instruments/rpg_reader.py,sha256=LAdXL3TmD5QzQbqtPOcemZji_qkXwmw6a6F8NmF6Zg8,11355
48
48
  cloudnetpy/instruments/toa5.py,sha256=1JnuYViD8c_tHJZ9lf4OU44iepEkXHsXOzDfVf_b0qc,1759
49
- cloudnetpy/instruments/vaisala.py,sha256=GzESZvboOoXzWmmr9dC-y6oM6ogc-M-zT3KmBTaD0LI,14512
49
+ cloudnetpy/instruments/vaisala.py,sha256=ektdXoID2X_V9H5Zp1fgHTUBapFMSyPVEWW_aoR6DEY,14655
50
50
  cloudnetpy/instruments/weather_station.py,sha256=0ajUvZ4BQIr_HXwBgEek2rf3Oorqp4L-t95gIUVK9vM,9650
51
51
  cloudnetpy/instruments/disdrometer/__init__.py,sha256=lyjwttWvFvuwYxEkusoAvgRcbBmglmOp5HJOpXUqLWo,93
52
52
  cloudnetpy/instruments/disdrometer/common.py,sha256=g52iK2aNp3Z88kovUmGVpC54NZomPa9D871gzO0AmQ4,9267
@@ -96,20 +96,20 @@ cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV
96
96
  cloudnetpy/plotting/plot_meta.py,sha256=cLdCZrhbP-gaobS_zjcf8d2xVALzl7zh2qpttxCHyrg,15983
97
97
  cloudnetpy/plotting/plotting.py,sha256=bve91iM9RcWmKaZOFWxVh2y3DPmupI1944MMYDdv17I,32459
98
98
  cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
99
- cloudnetpy/products/classification.py,sha256=0E9OUGR3uLCsS1nORwQu0SqW0_8uX7n6LlRcVhtzKw4,7845
100
- cloudnetpy/products/der.py,sha256=mam6jWV7A2h8V5WC3DIeFp6ou7UD1JOw9r7h2B0su-s,12403
99
+ cloudnetpy/products/classification.py,sha256=pzFQtgOKS7g_3LqiAY84EFUUste-VES7CJNgoq2Bs34,7914
100
+ cloudnetpy/products/der.py,sha256=XZMbqDQUq0E9iBU3Axr-NfUJfRAhjsaGlyxJ4tKyGcw,12444
101
101
  cloudnetpy/products/drizzle.py,sha256=BY2HvJeWt_ps6KKCGXwUUNRTy78q0cQM8bOCCoj8TWA,10803
102
102
  cloudnetpy/products/drizzle_error.py,sha256=4GwlHRtNbk9ks7bGtXCco-wXbcDOKeAQwKmbhzut6Qk,6132
103
103
  cloudnetpy/products/drizzle_tools.py,sha256=UhcJbPa4tXHbuVlegIRfOl5nZ_E6ddKv20aghfP0hdg,10847
104
- cloudnetpy/products/ier.py,sha256=IcGPlQahbwJjp3vOOrxWSYW2FPzbSV0KQL5eYECc4kU,7777
105
- cloudnetpy/products/iwc.py,sha256=MUPuVKWgqOuuLRCGk3QY74uBZB_7P1qlinlP8nEvz9o,10124
106
- cloudnetpy/products/lwc.py,sha256=TbIR6kMwjbm63ed5orB1pkqx9ZBm8C5TF2JmT8WKdKI,18794
104
+ cloudnetpy/products/ier.py,sha256=ZwjyRwh7dJPjz9K5x1HiLFyD0BDNsFx-B7zBAds_ACs,7838
105
+ cloudnetpy/products/iwc.py,sha256=kdYvOy2-xwY1Qnx8qdyGAhAjMJowh23Iv1JNuNxXNLA,10206
106
+ cloudnetpy/products/lwc.py,sha256=FOc-dYKM_OTLN1PK9yfApKiKCJYSv82BLPwXJqO2Bqo,18815
107
107
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
108
108
  cloudnetpy/products/mwr_tools.py,sha256=RuzokxxqXlTGk7XAOrif_FDPUJdf0j_wJgNq-7a_nK8,4684
109
109
  cloudnetpy/products/product_tools.py,sha256=rhx_Ru9FLlQqCNM-awoiHx18-Aq1eBwL9LiUaQoJs6k,10412
110
110
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
111
- cloudnetpy-1.61.7.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
- cloudnetpy-1.61.7.dist-info/METADATA,sha256=FcyxQIL3n-BVcQGqXwfpT51ahxWRkCEfcuADunGOQ6U,5784
113
- cloudnetpy-1.61.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
114
- cloudnetpy-1.61.7.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
- cloudnetpy-1.61.7.dist-info/RECORD,,
111
+ cloudnetpy-1.61.8.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
+ cloudnetpy-1.61.8.dist-info/METADATA,sha256=H7pCr4-e4fCepPEWkWBVLPvmGhmDMIxmelMF85JABLA,5784
113
+ cloudnetpy-1.61.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
114
+ cloudnetpy-1.61.8.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
+ cloudnetpy-1.61.8.dist-info/RECORD,,