cloudnetpy 1.79.1__tar.gz → 1.80.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 (132) hide show
  1. {cloudnetpy-1.79.1/cloudnetpy.egg-info → cloudnetpy-1.80.1}/PKG-INFO +2 -2
  2. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/ceilo.py +45 -29
  3. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/ceilometer.py +18 -0
  4. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/vaisala.py +7 -6
  5. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/version.py +1 -1
  6. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1/cloudnetpy.egg-info}/PKG-INFO +2 -2
  7. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy.egg-info/requires.txt +1 -1
  8. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/pyproject.toml +1 -1
  9. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/LICENSE +0 -0
  10. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/MANIFEST.in +0 -0
  11. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/README.md +0 -0
  12. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/__init__.py +0 -0
  13. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/__init__.py +0 -0
  14. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/atmos_utils.py +0 -0
  15. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/attenuation.py +0 -0
  16. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  17. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  18. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  19. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  20. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  21. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/categorize.py +0 -0
  22. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/classify.py +0 -0
  23. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/containers.py +0 -0
  24. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/disdrometer.py +0 -0
  25. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/droplet.py +0 -0
  26. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/falling.py +0 -0
  27. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/freezing.py +0 -0
  28. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/insects.py +0 -0
  29. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/itu.py +0 -0
  30. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/lidar.py +0 -0
  31. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/melting.py +0 -0
  32. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/model.py +0 -0
  33. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/mwr.py +0 -0
  34. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/categorize/radar.py +0 -0
  35. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/cli.py +0 -0
  36. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/cloudnetarray.py +0 -0
  37. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/concat_lib.py +0 -0
  38. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/constants.py +0 -0
  39. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/datasource.py +0 -0
  40. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/exceptions.py +0 -0
  41. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/__init__.py +0 -0
  42. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/basta.py +0 -0
  43. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/bowtie.py +0 -0
  44. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/cl61d.py +0 -0
  45. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  46. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/copernicus.py +0 -0
  47. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  48. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  49. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  50. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  51. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/fd12p.py +0 -0
  52. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/galileo.py +0 -0
  53. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/hatpro.py +0 -0
  54. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/instruments.py +0 -0
  55. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/lufft.py +0 -0
  56. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/mira.py +0 -0
  57. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/mrr.py +0 -0
  58. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/nc_lidar.py +0 -0
  59. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/nc_radar.py +0 -0
  60. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/pollyxt.py +0 -0
  61. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/radiometrics.py +0 -0
  62. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  63. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/rpg.py +0 -0
  64. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/rpg_reader.py +0 -0
  65. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/toa5.py +0 -0
  66. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/instruments/weather_station.py +0 -0
  67. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/metadata.py +0 -0
  68. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/__init__.py +0 -0
  69. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  70. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/metadata.py +0 -0
  71. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  72. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  73. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  74. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  75. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  76. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  77. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  78. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  79. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  80. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  81. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  82. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  83. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  84. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  85. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  86. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  87. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  88. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  89. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  90. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  91. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  92. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  93. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  94. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  95. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  96. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  97. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  98. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  99. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  100. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  101. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  102. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  103. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  104. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  105. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  106. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  107. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/model_evaluation/utils.py +0 -0
  108. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/output.py +0 -0
  109. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/plotting/__init__.py +0 -0
  110. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/plotting/plot_meta.py +0 -0
  111. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/plotting/plotting.py +0 -0
  112. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/__init__.py +0 -0
  113. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/classification.py +0 -0
  114. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/der.py +0 -0
  115. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/drizzle.py +0 -0
  116. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/drizzle_error.py +0 -0
  117. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/drizzle_tools.py +0 -0
  118. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/epsilon.py +0 -0
  119. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/ier.py +0 -0
  120. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/iwc.py +0 -0
  121. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/lwc.py +0 -0
  122. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  123. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/mwr_tools.py +0 -0
  124. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/products/product_tools.py +0 -0
  125. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/py.typed +0 -0
  126. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy/utils.py +0 -0
  127. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  128. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  129. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy.egg-info/entry_points.txt +0 -0
  130. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/cloudnetpy.egg-info/top_level.txt +0 -0
  131. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/docs/source/conf.py +0 -0
  132. {cloudnetpy-1.79.1 → cloudnetpy-1.80.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.79.1
3
+ Version: 1.80.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -38,7 +38,7 @@ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
38
38
  Requires-Python: >=3.10
39
39
  Description-Content-Type: text/markdown
40
40
  License-File: LICENSE
41
- Requires-Dist: ceilopyter
41
+ Requires-Dist: ceilopyter>=0.2.0
42
42
  Requires-Dist: doppy>=0.5.0
43
43
  Requires-Dist: matplotlib
44
44
  Requires-Dist: mwrpy>=1.3.0
@@ -4,6 +4,8 @@ import logging
4
4
  from itertools import islice
5
5
 
6
6
  import netCDF4
7
+ import numpy as np
8
+ from ceilopyter import read_ct25k
7
9
  from numpy import ma
8
10
 
9
11
  from cloudnetpy import output, utils
@@ -74,38 +76,52 @@ def ceilo2nc(
74
76
  range_corrected = site_meta.get("range_corrected", True)
75
77
  if range_corrected is False:
76
78
  logging.warning("Raw data not range-corrected.")
77
- ceilo_obj.read_ceilometer_file(calibration_factor)
78
- ceilo_obj.check_beta_raw_shape()
79
- n_negatives = _get_n_negatives(ceilo_obj)
80
- ceilo_obj.data["beta"] = ceilo_obj.calc_screened_product(
81
- ceilo_obj.data["beta_raw"],
82
- snr_limit,
83
- range_corrected=range_corrected,
84
- n_negatives=n_negatives,
85
- )
86
- ceilo_obj.data["beta_smooth"] = ceilo_obj.calc_beta_smooth(
87
- ceilo_obj.data["beta"],
88
- snr_limit,
89
- range_corrected=range_corrected,
90
- n_negatives=n_negatives,
91
- )
92
- if ceilo_obj.instrument is None or ceilo_obj.instrument.model is None:
93
- msg = "Failed to read ceilometer model"
94
- raise RuntimeError(msg)
95
- if (
96
- any(
97
- model in ceilo_obj.instrument.model.lower()
98
- for model in ("cl61", "chm15k", "chm15kx", "cl51", "cl31")
79
+ if isinstance(ceilo_obj, Ct25k):
80
+ c_obj = read_ct25k(full_path, calibration_factor, range_corrected)
81
+ ceilo_obj.data["beta"] = c_obj.beta
82
+ ceilo_obj.data["beta_raw"] = c_obj.beta_raw
83
+ ceilo_obj.data["time"] = c_obj.time
84
+ ceilo_obj.data["range"] = c_obj.range
85
+ if c_obj.zenith_angle is not None:
86
+ ceilo_obj.data["zenith_angle"] = np.median(c_obj.zenith_angle)
87
+ ceilo_obj.data["calibration_factor"] = c_obj.calibration_factor
88
+ ceilo_obj.sort_time()
89
+ ceilo_obj.screen_date()
90
+ ceilo_obj.convert_to_fraction_hour()
91
+ else:
92
+ ceilo_obj.read_ceilometer_file(calibration_factor)
93
+ ceilo_obj.check_beta_raw_shape()
94
+ n_negatives = _get_n_negatives(ceilo_obj)
95
+ ceilo_obj.data["beta"] = ceilo_obj.calc_screened_product(
96
+ ceilo_obj.data["beta_raw"],
97
+ snr_limit,
98
+ range_corrected=range_corrected,
99
+ n_negatives=n_negatives,
100
+ )
101
+ ceilo_obj.data["beta_smooth"] = ceilo_obj.calc_beta_smooth(
102
+ ceilo_obj.data["beta"],
103
+ snr_limit,
104
+ range_corrected=range_corrected,
105
+ n_negatives=n_negatives,
99
106
  )
100
- and range_corrected
101
- ):
102
- mask = ceilo_obj.data["beta_smooth"].mask
103
- ceilo_obj.data["beta"] = ma.masked_where(mask, ceilo_obj.data["beta_raw"])
104
- ceilo_obj.data["beta"][ceilo_obj.data["beta"] <= 0] = ma.masked
105
- if "depolarisation" in ceilo_obj.data:
106
- ceilo_obj.data["depolarisation"].mask = ceilo_obj.data["beta"].mask
107
+ if ceilo_obj.instrument is None or ceilo_obj.instrument.model is None:
108
+ msg = "Failed to read ceilometer model"
109
+ raise RuntimeError(msg)
110
+ if (
111
+ any(
112
+ model in ceilo_obj.instrument.model.lower()
113
+ for model in ("cl61", "chm15k", "chm15kx", "cl51", "cl31")
114
+ )
115
+ and range_corrected
116
+ ):
117
+ mask = ceilo_obj.data["beta_smooth"].mask
118
+ ceilo_obj.data["beta"] = ma.masked_where(mask, ceilo_obj.data["beta_raw"])
119
+ ceilo_obj.data["beta"][ceilo_obj.data["beta"] <= 0] = ma.masked
120
+ if "depolarisation" in ceilo_obj.data:
121
+ ceilo_obj.data["depolarisation"].mask = ceilo_obj.data["beta"].mask
107
122
  ceilo_obj.screen_depol()
108
123
  ceilo_obj.screen_invalid_values()
124
+ ceilo_obj.screen_sunbeam()
109
125
  ceilo_obj.prepare_data()
110
126
  ceilo_obj.data_to_cloudnet_arrays()
111
127
  ceilo_obj.add_site_geolocation()
@@ -137,6 +137,24 @@ class Ceilometer:
137
137
  msg = f"Invalid beta_raw shape: {beta_raw.shape}"
138
138
  raise ValidTimeStampError(msg)
139
139
 
140
+ def screen_sunbeam(self) -> None:
141
+ high_alt_mask = self.data["range"] > 10000
142
+ if not np.any(high_alt_mask):
143
+ return
144
+
145
+ is_data = ~self.data["beta"][:, high_alt_mask].mask
146
+ n_bins = 20
147
+
148
+ n_profiles, n_heights = is_data.shape
149
+ bin_size = n_heights // n_bins
150
+ reshaped = is_data[:, : bin_size * n_bins].reshape(n_profiles, n_bins, bin_size)
151
+
152
+ valid_profiles = np.any(reshaped, axis=2).sum(axis=1) < 15
153
+
154
+ for key, value in self.data.items():
155
+ if key == "time" or (isinstance(value, np.ndarray) and value.ndim == 2):
156
+ self.data[key] = value[valid_profiles]
157
+
140
158
 
141
159
  class NoisyData:
142
160
  def __init__(
@@ -46,18 +46,18 @@ class VaisalaCeilo(Ceilometer):
46
46
  self.data["calibration_factor"] = calibration_factor or 1.0
47
47
  self.data["beta_raw"] *= self.data["calibration_factor"]
48
48
  self.data["zenith_angle"] = np.median([d.tilt_angle for d in data])
49
- self._sort_time()
50
- self._screen_date()
51
- self._convert_to_fraction_hour()
49
+ self.sort_time()
50
+ self.screen_date()
51
+ self.convert_to_fraction_hour()
52
52
  self._store_ceilometer_info()
53
53
 
54
- def _sort_time(self):
54
+ def sort_time(self):
55
55
  """Sorts timestamps and removes duplicates."""
56
56
  time = self.data["time"]
57
57
  _time, ind = np.unique(time, return_index=True)
58
58
  self._screen_time_indices(ind)
59
59
 
60
- def _screen_date(self):
60
+ def screen_date(self):
61
61
  time = self.data["time"]
62
62
  if self.sane_date is None:
63
63
  self.sane_date = time[0].date()
@@ -79,7 +79,7 @@ class VaisalaCeilo(Ceilometer):
79
79
  if hasattr(array, "shape") and array.shape[:1] == (n_time,):
80
80
  self.data[key] = self.data[key][valid_indices]
81
81
 
82
- def _convert_to_fraction_hour(self):
82
+ def convert_to_fraction_hour(self):
83
83
  time = self.data["time"]
84
84
  midnight = time[0].replace(hour=0, minute=0, second=0, microsecond=0)
85
85
  hour = datetime.timedelta(hours=1)
@@ -113,6 +113,7 @@ class Ct25k(VaisalaCeilo):
113
113
 
114
114
  def __init__(self, full_path, site_meta, expected_date=None):
115
115
  super().__init__(read_ct_file, full_path, site_meta, expected_date)
116
+ self._store_ceilometer_info()
116
117
 
117
118
  def _store_ceilometer_info(self):
118
119
  self.instrument = instruments.CT25K
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 79
2
+ MINOR = 80
3
3
  PATCH = 1
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.79.1
3
+ Version: 1.80.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -38,7 +38,7 @@ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
38
38
  Requires-Python: >=3.10
39
39
  Description-Content-Type: text/markdown
40
40
  License-File: LICENSE
41
- Requires-Dist: ceilopyter
41
+ Requires-Dist: ceilopyter>=0.2.0
42
42
  Requires-Dist: doppy>=0.5.0
43
43
  Requires-Dist: matplotlib
44
44
  Requires-Dist: mwrpy>=1.3.0
@@ -1,4 +1,4 @@
1
- ceilopyter
1
+ ceilopyter>=0.2.0
2
2
  doppy>=0.5.0
3
3
  matplotlib
4
4
  mwrpy>=1.3.0
@@ -14,7 +14,7 @@ classifiers = [
14
14
  "Topic :: Scientific/Engineering :: Atmospheric Science",
15
15
  ]
16
16
  dependencies = [
17
- "ceilopyter",
17
+ "ceilopyter>=0.2.0",
18
18
  "doppy>=0.5.0",
19
19
  "matplotlib",
20
20
  "mwrpy>=1.3.0",
File without changes
File without changes
File without changes
File without changes