cloudnetpy 1.68.1__tar.gz → 1.69.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 (130) hide show
  1. {cloudnetpy-1.68.1/cloudnetpy.egg-info → cloudnetpy-1.69.1}/PKG-INFO +1 -1
  2. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/model.py +2 -2
  3. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/copernicus.py +1 -1
  4. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/galileo.py +1 -1
  5. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/mira.py +13 -1
  6. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/nc_radar.py +9 -0
  7. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/weather_station.py +49 -1
  8. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/version.py +1 -1
  9. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1/cloudnetpy.egg-info}/PKG-INFO +1 -1
  10. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/LICENSE +0 -0
  11. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/MANIFEST.in +0 -0
  12. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/README.md +0 -0
  13. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/__init__.py +0 -0
  14. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/__init__.py +0 -0
  15. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/atmos_utils.py +0 -0
  16. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/attenuation.py +0 -0
  17. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  18. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  19. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  20. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  21. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  22. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/categorize.py +0 -0
  23. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/classify.py +0 -0
  24. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/containers.py +0 -0
  25. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/disdrometer.py +0 -0
  26. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/droplet.py +0 -0
  27. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/falling.py +0 -0
  28. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/freezing.py +0 -0
  29. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/insects.py +0 -0
  30. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/itu.py +0 -0
  31. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/lidar.py +0 -0
  32. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/melting.py +0 -0
  33. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/mwr.py +0 -0
  34. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/categorize/radar.py +0 -0
  35. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/cli.py +0 -0
  36. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/cloudnetarray.py +0 -0
  37. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/concat_lib.py +0 -0
  38. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/constants.py +0 -0
  39. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/datasource.py +0 -0
  40. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/exceptions.py +0 -0
  41. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/__init__.py +0 -0
  42. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/basta.py +0 -0
  43. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/campbell_scientific.py +0 -0
  44. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/ceilo.py +0 -0
  45. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/ceilometer.py +0 -0
  46. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/cl61d.py +0 -0
  47. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  48. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  49. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  50. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  51. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  52. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/hatpro.py +0 -0
  53. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/instruments.py +0 -0
  54. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/lufft.py +0 -0
  55. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/mrr.py +0 -0
  56. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/nc_lidar.py +0 -0
  57. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/pollyxt.py +0 -0
  58. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/radiometrics.py +0 -0
  59. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  60. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/rpg.py +0 -0
  61. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/rpg_reader.py +0 -0
  62. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/toa5.py +0 -0
  63. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/instruments/vaisala.py +0 -0
  64. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/metadata.py +0 -0
  65. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/__init__.py +0 -0
  66. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  67. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/metadata.py +0 -0
  68. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  69. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  70. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  71. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  72. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  73. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  74. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  75. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  76. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  77. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  78. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  79. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  80. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  81. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  82. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  83. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  84. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  85. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  86. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  87. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  88. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  89. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  90. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  91. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  92. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  93. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  94. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  95. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  96. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  97. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  98. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  99. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  100. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  101. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  102. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  103. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  104. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/model_evaluation/utils.py +0 -0
  105. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/output.py +0 -0
  106. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/plotting/__init__.py +0 -0
  107. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/plotting/plot_meta.py +0 -0
  108. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/plotting/plotting.py +0 -0
  109. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/__init__.py +0 -0
  110. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/classification.py +0 -0
  111. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/der.py +0 -0
  112. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/drizzle.py +0 -0
  113. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/drizzle_error.py +0 -0
  114. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/drizzle_tools.py +0 -0
  115. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/ier.py +0 -0
  116. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/iwc.py +0 -0
  117. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/lwc.py +0 -0
  118. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  119. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/mwr_tools.py +0 -0
  120. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/products/product_tools.py +0 -0
  121. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/py.typed +0 -0
  122. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy/utils.py +0 -0
  123. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  124. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  125. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy.egg-info/entry_points.txt +0 -0
  126. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy.egg-info/requires.txt +0 -0
  127. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/cloudnetpy.egg-info/top_level.txt +0 -0
  128. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/docs/source/conf.py +0 -0
  129. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/pyproject.toml +0 -0
  130. {cloudnetpy-1.68.1 → cloudnetpy-1.69.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cloudnetpy
3
- Version: 1.68.1
3
+ Version: 1.69.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -164,11 +164,11 @@ def _calc_mean_height(model_heights: np.ndarray) -> np.ndarray:
164
164
 
165
165
  def _find_model_type(file_name: str) -> str:
166
166
  """Finds model type from the model filename."""
167
- possible_keys = ("gdas1", "icon", "ecmwf", "harmonie", "era5")
167
+ possible_keys = ("gdas1", "icon", "ecmwf", "harmonie", "era5", "arpege")
168
168
  for key in possible_keys:
169
169
  if key in file_name:
170
170
  return key
171
- msg = "Unknown model type"
171
+ msg = f"Unknown model type: {file_name}"
172
172
  raise ValueError(msg)
173
173
 
174
174
 
@@ -97,7 +97,7 @@ def copernicus2nc(
97
97
  copernicus.add_nyquist_velocity(keymap)
98
98
  copernicus.add_site_geolocation()
99
99
  valid_indices = copernicus.add_zenith_and_azimuth_angles(
100
- elevation_threshold=1,
100
+ elevation_threshold=1.1,
101
101
  elevation_diff_threshold=0.1,
102
102
  azimuth_diff_threshold=0.1,
103
103
  )
@@ -93,7 +93,7 @@ def galileo2nc(
93
93
  galileo.add_nyquist_velocity(keymap)
94
94
  galileo.add_site_geolocation()
95
95
  valid_indices = galileo.add_zenith_and_azimuth_angles(
96
- elevation_threshold=1,
96
+ elevation_threshold=1.1,
97
97
  elevation_diff_threshold=0.1,
98
98
  azimuth_diff_threshold=0.1,
99
99
  )
@@ -87,9 +87,11 @@ def mira2nc(
87
87
  mira.add_site_geolocation()
88
88
  mira.add_radar_specific_variables()
89
89
  valid_indices = mira.add_zenith_and_azimuth_angles(
90
- elevation_threshold=1,
90
+ elevation_threshold=1.1,
91
91
  elevation_diff_threshold=1e-6,
92
92
  azimuth_diff_threshold=1e-3,
93
+ zenith_offset=site_meta.get("zenith_offset"),
94
+ azimuth_offset=site_meta.get("azimuth_offset"),
93
95
  )
94
96
  mira.screen_time_indices(valid_indices)
95
97
  mira.add_height()
@@ -298,4 +300,14 @@ ATTRIBUTES = {
298
300
  long_name="Pulse Repetition Frequency",
299
301
  units="Hz",
300
302
  ),
303
+ "zenith_offset": MetaData(
304
+ long_name="Zenith offset of the instrument",
305
+ units="degrees",
306
+ comment="Zenith offset applied.",
307
+ ),
308
+ "azimuth_offset": MetaData(
309
+ long_name="Azimuth offset of the instrument (positive clockwise from north)",
310
+ units="degrees",
311
+ comment="Azimuth offset applied.",
312
+ ),
301
313
  }
@@ -95,12 +95,21 @@ class NcRadar(DataSource, CloudnetInstrument):
95
95
  elevation_threshold: float,
96
96
  elevation_diff_threshold: float,
97
97
  azimuth_diff_threshold: float,
98
+ zenith_offset: float | None = None,
99
+ azimuth_offset: float | None = None,
98
100
  ) -> list:
99
101
  """Adds non-varying instrument zenith and azimuth angles and returns valid
100
102
  time indices.
101
103
  """
102
104
  elevation = self.data["elevation"].data
105
+ if zenith_offset is not None:
106
+ self.append_data(zenith_offset, "zenith_offset")
107
+ elevation -= zenith_offset
108
+
103
109
  azimuth = self.data["azimuth_angle"].data
110
+ if azimuth_offset is not None:
111
+ self.append_data(azimuth_offset, "azimuth_offset")
112
+ azimuth += azimuth_offset
104
113
 
105
114
  elevation_diff = ma.diff(elevation, prepend=elevation[1])
106
115
  azimuth_diff = ma.diff(azimuth, prepend=azimuth[1])
@@ -57,6 +57,8 @@ def ws2nc(
57
57
  ws = HyytialaWS(weather_station_file, site_meta)
58
58
  elif site_meta["name"] == "Galați":
59
59
  ws = GalatiWS(weather_station_file, site_meta)
60
+ elif site_meta["name"] == "Jülich":
61
+ ws = JuelichWS(weather_station_file, site_meta)
60
62
  else:
61
63
  msg = "Unsupported site"
62
64
  raise ValueError(msg) # noqa: TRY301
@@ -87,7 +89,7 @@ class WS(CSVFile):
87
89
  date: list[str]
88
90
 
89
91
  def calculate_rainfall_amount(self) -> None:
90
- if "rainfall_amount" in self.data:
92
+ if "rainfall_amount" in self.data or "rainfall_rate" not in self.data:
91
93
  return
92
94
  resolution = np.median(np.diff(self.data["time"].data)) * SEC_IN_HOUR
93
95
  rainfall_amount = ma.cumsum(self.data["rainfall_rate"].data * resolution)
@@ -116,6 +118,8 @@ class WS(CSVFile):
116
118
  self.data["relative_humidity"].data = self.data["relative_humidity"][:] / 100
117
119
 
118
120
  def convert_rainfall_rate(self) -> None:
121
+ if "rainfall_rate" not in self.data:
122
+ return
119
123
  rainfall_rate = self.data["rainfall_rate"][:]
120
124
  self.data["rainfall_rate"].data = rainfall_rate / 60 / 1000 # mm/min -> m/s
121
125
 
@@ -438,3 +442,47 @@ class GalatiWS(WS):
438
442
  def convert_pressure(self) -> None:
439
443
  mmHg2Pa = 133.322
440
444
  self.data["air_pressure"].data = self.data["air_pressure"][:] * mmHg2Pa
445
+
446
+
447
+ class JuelichWS(WS):
448
+ def __init__(self, filenames: list[str], site_meta: dict):
449
+ super().__init__(site_meta)
450
+ self.filename = filenames[0]
451
+ self._data = self._read_data()
452
+
453
+ def _read_data(self) -> dict:
454
+ keymap = {
455
+ "TIMESTAMP": "time",
456
+ "AirTC_Avg": "air_temperature",
457
+ "RH": "relative_humidity",
458
+ "BV_BP_Avg": "air_pressure",
459
+ "WS_ms_S_WVT": "wind_speed",
460
+ "WindDir_D1_WVT": "wind_direction",
461
+ }
462
+ expected_units = {
463
+ "AirTC_Avg": "Deg C",
464
+ "RH": "%",
465
+ "BV_BP_Avg": "hPa",
466
+ "WS_ms_S_WVT": "meters/Second",
467
+ "WindDir_D1_WVT": "Deg",
468
+ }
469
+ units, process, rows = read_toa5(self.filename)
470
+ for key in units:
471
+ if key in expected_units and expected_units[key] != units[key]:
472
+ msg = (
473
+ f"Expected {key} to have units {expected_units[key]},"
474
+ f" got {units[key]} instead"
475
+ )
476
+ raise ValueError(msg)
477
+
478
+ data: dict[str, list] = {keymap[key]: [] for key in units if key in keymap}
479
+ for row in rows:
480
+ for key, value in row.items():
481
+ if key not in keymap:
482
+ continue
483
+ parsed = value
484
+ if keymap[key] != "time":
485
+ parsed = float(value)
486
+ data[keymap[key]].append(parsed)
487
+
488
+ return self.format_data(data)
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 68
2
+ MINOR = 69
3
3
  PATCH = 1
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cloudnetpy
3
- Version: 1.68.1
3
+ Version: 1.69.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