cloudnetpy 1.64.5__tar.gz → 1.65.1__tar.gz

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 (121) hide show
  1. {cloudnetpy-1.64.5/cloudnetpy.egg-info → cloudnetpy-1.65.1}/PKG-INFO +1 -1
  2. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/atmos.py +8 -1
  3. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/categorize.py +35 -29
  4. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/containers.py +5 -1
  5. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/exceptions.py +7 -0
  6. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/hatpro.py +4 -0
  7. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/der.py +4 -0
  8. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/lwc.py +4 -0
  9. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/version.py +2 -2
  10. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1/cloudnetpy.egg-info}/PKG-INFO +1 -1
  11. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/LICENSE +0 -0
  12. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/MANIFEST.in +0 -0
  13. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/README.md +0 -0
  14. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/__init__.py +0 -0
  15. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/__init__.py +0 -0
  16. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/atmos_utils.py +0 -0
  17. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/classify.py +0 -0
  18. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/disdrometer.py +0 -0
  19. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/droplet.py +0 -0
  20. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/falling.py +0 -0
  21. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/freezing.py +0 -0
  22. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/insects.py +0 -0
  23. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/lidar.py +0 -0
  24. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/melting.py +0 -0
  25. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/model.py +0 -0
  26. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/mwr.py +0 -0
  27. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/categorize/radar.py +0 -0
  28. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/cloudnetarray.py +0 -0
  29. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/concat_lib.py +0 -0
  30. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/constants.py +0 -0
  31. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/datasource.py +0 -0
  32. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/__init__.py +0 -0
  33. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/basta.py +0 -0
  34. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/campbell_scientific.py +0 -0
  35. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/ceilo.py +0 -0
  36. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/ceilometer.py +0 -0
  37. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/cl61d.py +0 -0
  38. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  39. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/copernicus.py +0 -0
  40. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  41. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  42. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  43. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  44. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/galileo.py +0 -0
  45. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/instruments.py +0 -0
  46. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/lufft.py +0 -0
  47. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/mira.py +0 -0
  48. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/mrr.py +0 -0
  49. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/nc_lidar.py +0 -0
  50. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/nc_radar.py +0 -0
  51. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/pollyxt.py +0 -0
  52. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/radiometrics.py +0 -0
  53. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/rpg.py +0 -0
  54. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/rpg_reader.py +0 -0
  55. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/toa5.py +0 -0
  56. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/vaisala.py +0 -0
  57. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/instruments/weather_station.py +0 -0
  58. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/metadata.py +0 -0
  59. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/__init__.py +0 -0
  60. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  61. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/metadata.py +0 -0
  62. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  63. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  64. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  65. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  66. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  67. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  68. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  69. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  70. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  71. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  72. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  73. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  74. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  75. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  76. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  77. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  78. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  79. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  80. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  81. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  82. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  83. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  84. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  85. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  86. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  87. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  88. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  89. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  90. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  91. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  92. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  93. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  94. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  95. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  96. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  97. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  98. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/model_evaluation/utils.py +0 -0
  99. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/output.py +0 -0
  100. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/plotting/__init__.py +0 -0
  101. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/plotting/plot_meta.py +0 -0
  102. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/plotting/plotting.py +0 -0
  103. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/__init__.py +0 -0
  104. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/classification.py +0 -0
  105. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/drizzle.py +0 -0
  106. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/drizzle_error.py +0 -0
  107. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/drizzle_tools.py +0 -0
  108. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/ier.py +0 -0
  109. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/iwc.py +0 -0
  110. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  111. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/mwr_tools.py +0 -0
  112. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/products/product_tools.py +0 -0
  113. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/py.typed +0 -0
  114. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy/utils.py +0 -0
  115. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  116. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  117. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy.egg-info/requires.txt +0 -0
  118. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/cloudnetpy.egg-info/top_level.txt +0 -0
  119. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/docs/source/conf.py +0 -0
  120. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/pyproject.toml +0 -0
  121. {cloudnetpy-1.64.5 → cloudnetpy-1.65.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.64.5
3
+ Version: 1.65.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -181,7 +181,14 @@ class LiquidAttenuation(Attenuation):
181
181
 
182
182
  def __init__(self, data: dict, classification: ClassificationResult):
183
183
  super().__init__(data["model"], classification)
184
- self._mwr = data["mwr"].data
184
+ if data["mwr"] is not None:
185
+ self._mwr = data["mwr"].data
186
+ else:
187
+ n_time = data["radar"].data["Z"][:].shape[0]
188
+ self._mwr = {
189
+ "lwp": ma.masked_all(n_time),
190
+ "lwp_error": ma.masked_all(n_time),
191
+ }
185
192
  self._lwc_dz_err = self._get_lwc_change_rate_error()
186
193
  self.atten = self._get_liquid_atten()
187
194
  self.atten_err = self._get_liquid_atten_err()
@@ -20,54 +20,58 @@ def generate_categorize(
20
20
  uuid: str | None = None,
21
21
  options: dict | None = None,
22
22
  ) -> str:
23
- """Generates Cloudnet Level 1c categorize file.
23
+ """Generates a Cloudnet Level 1c categorize file.
24
24
 
25
- The measurements are rebinned into a common height / time grid,
26
- and classified as different types of scatterers such as ice, liquid,
27
- insects, etc. Next, the radar signal is corrected for atmospheric
28
- attenuation, and error estimates are computed. Results are saved
29
- in *output_file* which is a compressed netCDF4 file.
25
+ This function rebins measurements into a common height/time grid
26
+ and classifies them into different scatterer types, such as ice,
27
+ liquid, insects, etc. The radar signal is corrected for atmospheric
28
+ attenuation, and error estimates are computed. The results are saved in
29
+ *output_file*, a compressed netCDF4 file.
30
30
 
31
31
  Args:
32
- input_files: dict containing file names for calibrated `radar`, `lidar`,
33
- `model` and `mwr` files. Optionally also `lv0_files`, a list of
34
- RPG level 0 files.
35
- output_file: Full path of the output file.
36
- uuid: Set specific UUID for the file.
37
- options: Dictionary containing optional parameters.
32
+ input_files (dict): Contains filenames for calibrated `radar`, `lidar`,
33
+ and `model` files. Optionally, it can also include `disdrometer`,
34
+ `mwr` (containing the LWP variable), and `lv0_files` (a list of RPG
35
+ Level 0 files).
36
+ output_file (str): The full path of the output file.
37
+ uuid (str): Specific UUID to assign to the generated file.
38
+ options (dict): Dictionary containing optional parameters.
38
39
 
39
40
  Returns:
40
- UUID of the generated file.
41
+ str: UUID of the generated file.
41
42
 
42
43
  Raises:
43
- RuntimeError: Failed to create the categorize file.
44
+ RuntimeError: Raised if the categorize file creation fails.
44
45
 
45
46
  Notes:
46
- Separate mwr-file is not needed when using RPG cloud radar which
47
- measures liquid water path. Then, the radar file can be used as
48
- a mwr-file as well, i.e. {'mwr': 'radar.nc'}.
47
+ A separate MWR file is not required when using an RPG cloud radar that
48
+ measures liquid water path (LWP). In this case, the radar file can also
49
+ serve as the MWR file (e.g., {'mwr': 'radar.nc'}). If no MWR file
50
+ is provided, liquid attenuation correction cannot be performed.
49
51
 
50
- If RPG L0 files are provided as an additional input, Voodoo method is used
51
- to detect liquid droplets.
52
+ If RPG L0 files are included as additional input, the Voodoo method
53
+ is used to detect liquid droplets.
52
54
 
53
55
  Examples:
54
56
  >>> from cloudnetpy.categorize import generate_categorize
55
- >>> input_files = {'radar': 'radar.nc',
56
- 'lidar': 'lidar.nc',
57
- 'model': 'model.nc',
58
- 'mwr': 'mwr.nc'}
57
+ >>> input_files = {
58
+ ... 'radar': 'radar.nc',
59
+ ... 'lidar': 'lidar.nc',
60
+ ... 'model': 'model.nc',
61
+ ... 'mwr': 'mwr.nc'
62
+ ... }
59
63
  >>> generate_categorize(input_files, 'output.nc')
60
64
 
61
- >>> input_files["lv0_files"] = ["file1.LV0", "file2.LV0"] # Add RGP LV0 files
62
- >>> generate_categorize(input_files, 'output.nc') # Use Voodoo method
63
-
65
+ >>> input_files['lv0_files'] = ['file1.LV0', 'file2.LV0'] # Add RPG LV0 files
66
+ >>> generate_categorize(input_files, 'output.nc') # Use the Voodoo method
64
67
  """
65
68
 
66
69
  def _interpolate_to_cloudnet_grid() -> list:
67
70
  wl_band = utils.get_wl_band(data["radar"].radar_frequency)
68
- data["mwr"].rebin_to_grid(time)
69
71
  if data["disdrometer"] is not None:
70
72
  data["disdrometer"].interpolate_to_grid(time)
73
+ if data["mwr"] is not None:
74
+ data["mwr"].rebin_to_grid(time)
71
75
  data["model"].interpolate_to_common_height(wl_band)
72
76
  model_gap_ind = data["model"].interpolate_to_grid(time, height)
73
77
  radar_gap_ind = data["radar"].rebin_to_grid(time)
@@ -115,7 +119,7 @@ def generate_categorize(
115
119
  **data["lidar"].data,
116
120
  **data["model"].data,
117
121
  **data["model"].data_sparse,
118
- **data["mwr"].data,
122
+ **(data["mwr"].data if data["mwr"] is not None else {}),
119
123
  **(data["disdrometer"].data if data["disdrometer"] is not None else {}),
120
124
  }
121
125
 
@@ -131,10 +135,12 @@ def generate_categorize(
131
135
  data: dict = {
132
136
  "radar": Radar(input_files["radar"]),
133
137
  "lidar": Lidar(input_files["lidar"]),
134
- "mwr": Mwr(input_files["mwr"]),
135
138
  "lv0_files": input_files.get("lv0_files"),
139
+ "mwr": None,
136
140
  "disdrometer": None,
137
141
  }
142
+ if "mwr" in input_files:
143
+ data["mwr"] = Mwr(input_files["mwr"])
138
144
  if "disdrometer" in input_files:
139
145
  try:
140
146
  data["disdrometer"] = Disdrometer(input_files["disdrometer"])
@@ -58,7 +58,11 @@ class ClassData:
58
58
  self.tw = data["model"].data["Tw"][:]
59
59
  self.model_type = data["model"].source_type
60
60
  self.beta = data["lidar"].data["beta"][:]
61
- self.lwp = data["mwr"].data["lwp"][:]
61
+ self.lwp = (
62
+ data["mwr"].data["lwp"][:]
63
+ if data["mwr"] is not None
64
+ else ma.masked_all(self.time.shape)
65
+ )
62
66
  self.is_rain = self._find_profiles_with_rain()
63
67
  self.is_clutter = _find_clutter(self.v, self.is_rain)
64
68
  self.altitude = data["radar"].altitude
@@ -63,3 +63,10 @@ class HatproDataError(CloudnetException):
63
63
 
64
64
  def __init__(self, msg: str = "Invalid HATPRO file"):
65
65
  super().__init__(msg)
66
+
67
+
68
+ class InvalidSourceFileError(CloudnetException):
69
+ """Internal exception class."""
70
+
71
+ def __init__(self, msg: str = "Invalid source file"):
72
+ super().__init__(msg)
@@ -60,6 +60,10 @@ def hatpro2l1c(
60
60
 
61
61
  hatpro = HatproL1c(hatpro_raw, site_meta)
62
62
 
63
+ if not np.any(hatpro.data["tb"][:]):
64
+ msg = "No valid brightness temperatures found"
65
+ raise HatproDataError(msg)
66
+
63
67
  timestamps = hatpro.data["time"][:]
64
68
  if date is not None:
65
69
  # Screen timestamps if these assertions start to fail
@@ -10,6 +10,7 @@ from numpy import ma
10
10
  from cloudnetpy import output, utils
11
11
  from cloudnetpy.categorize import atmos
12
12
  from cloudnetpy.datasource import DataSource
13
+ from cloudnetpy.exceptions import InvalidSourceFileError
13
14
  from cloudnetpy.metadata import MetaData
14
15
  from cloudnetpy.products.product_tools import (
15
16
  CategorizeBits,
@@ -113,6 +114,9 @@ class DerSource(DataSource):
113
114
 
114
115
  def __init__(self, categorize_file: str, parameters: Parameters | None = None):
115
116
  super().__init__(categorize_file)
117
+ if "lwp" not in self.dataset.variables:
118
+ msg = "Liquid water path missing from the categorize file."
119
+ raise InvalidSourceFileError(msg)
116
120
  self.is_rain = get_is_rain(categorize_file)
117
121
  self.categorize_bits = CategorizeBits(categorize_file)
118
122
  if parameters is None:
@@ -8,6 +8,7 @@ from numpy import ma
8
8
  from cloudnetpy import output, utils
9
9
  from cloudnetpy.categorize import atmos
10
10
  from cloudnetpy.datasource import DataSource
11
+ from cloudnetpy.exceptions import InvalidSourceFileError
11
12
  from cloudnetpy.metadata import MetaData
12
13
  from cloudnetpy.products import product_tools as p_tools
13
14
  from cloudnetpy.products.product_tools import CategorizeBits, get_is_rain
@@ -88,6 +89,9 @@ class LwcSource(DataSource):
88
89
 
89
90
  def __init__(self, categorize_file: str):
90
91
  super().__init__(categorize_file)
92
+ if "lwp" not in self.dataset.variables:
93
+ msg = "Liquid water path missing from the categorize file."
94
+ raise InvalidSourceFileError(msg)
91
95
  self.lwp = self.getvar("lwp")
92
96
  self.lwp[self.lwp < 0] = 0
93
97
  self.lwp_error = self.getvar("lwp_error")
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 64
3
- PATCH = 5
2
+ MINOR = 65
3
+ PATCH = 1
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.64.5
3
+ Version: 1.65.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
File without changes
File without changes
File without changes
File without changes
File without changes