cloudnetpy 1.69.10__tar.gz → 1.70.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.69.10/cloudnetpy.egg-info → cloudnetpy-1.70.1}/PKG-INFO +1 -1
  2. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/constants.py +2 -1
  3. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/plotting/plot_meta.py +20 -0
  4. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/plotting/plotting.py +50 -21
  5. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/version.py +2 -2
  6. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1/cloudnetpy.egg-info}/PKG-INFO +1 -1
  7. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/LICENSE +0 -0
  8. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/MANIFEST.in +0 -0
  9. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/README.md +0 -0
  10. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/__init__.py +0 -0
  11. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/__init__.py +0 -0
  12. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/atmos_utils.py +0 -0
  13. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/attenuation.py +0 -0
  14. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
  15. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
  16. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
  17. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
  18. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
  19. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/categorize.py +0 -0
  20. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/classify.py +0 -0
  21. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/containers.py +0 -0
  22. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/disdrometer.py +0 -0
  23. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/droplet.py +0 -0
  24. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/falling.py +0 -0
  25. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/freezing.py +0 -0
  26. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/insects.py +0 -0
  27. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/itu.py +0 -0
  28. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/lidar.py +0 -0
  29. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/melting.py +0 -0
  30. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/model.py +0 -0
  31. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/mwr.py +0 -0
  32. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/categorize/radar.py +0 -0
  33. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/cli.py +0 -0
  34. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/cloudnetarray.py +0 -0
  35. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/concat_lib.py +0 -0
  36. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/datasource.py +0 -0
  37. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/exceptions.py +0 -0
  38. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/__init__.py +0 -0
  39. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/basta.py +0 -0
  40. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/campbell_scientific.py +0 -0
  41. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/ceilo.py +0 -0
  42. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/ceilometer.py +0 -0
  43. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/cl61d.py +0 -0
  44. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
  45. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/copernicus.py +0 -0
  46. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
  47. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/disdrometer/common.py +0 -0
  48. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
  49. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
  50. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/galileo.py +0 -0
  51. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/hatpro.py +0 -0
  52. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/instruments.py +0 -0
  53. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/lufft.py +0 -0
  54. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/mira.py +0 -0
  55. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/mrr.py +0 -0
  56. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/nc_lidar.py +0 -0
  57. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/nc_radar.py +0 -0
  58. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/pollyxt.py +0 -0
  59. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/radiometrics.py +0 -0
  60. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/rain_e_h3.py +0 -0
  61. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/rpg.py +0 -0
  62. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/rpg_reader.py +0 -0
  63. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/toa5.py +0 -0
  64. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/vaisala.py +0 -0
  65. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/instruments/weather_station.py +0 -0
  66. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/metadata.py +0 -0
  67. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/__init__.py +0 -0
  68. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/file_handler.py +0 -0
  69. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/metadata.py +0 -0
  70. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
  71. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
  72. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
  73. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
  74. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
  75. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
  76. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
  77. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
  78. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
  79. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
  80. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
  81. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/products/tools.py +0 -0
  82. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
  83. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
  84. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
  85. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
  86. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
  87. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
  88. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
  89. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
  90. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
  91. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
  92. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
  93. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
  94. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
  95. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
  96. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
  97. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
  98. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
  99. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
  100. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
  101. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
  102. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
  103. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
  104. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
  105. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
  106. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/model_evaluation/utils.py +0 -0
  107. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/output.py +0 -0
  108. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/plotting/__init__.py +0 -0
  109. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/__init__.py +0 -0
  110. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/classification.py +0 -0
  111. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/der.py +0 -0
  112. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/drizzle.py +0 -0
  113. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/drizzle_error.py +0 -0
  114. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/drizzle_tools.py +0 -0
  115. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/ier.py +0 -0
  116. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/iwc.py +0 -0
  117. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/lwc.py +0 -0
  118. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/mie_lu_tables.nc +0 -0
  119. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/mwr_tools.py +0 -0
  120. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/products/product_tools.py +0 -0
  121. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/py.typed +0 -0
  122. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy/utils.py +0 -0
  123. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy.egg-info/SOURCES.txt +0 -0
  124. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy.egg-info/dependency_links.txt +0 -0
  125. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy.egg-info/entry_points.txt +0 -0
  126. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy.egg-info/requires.txt +0 -0
  127. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/cloudnetpy.egg-info/top_level.txt +0 -0
  128. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/docs/source/conf.py +0 -0
  129. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/pyproject.toml +0 -0
  130. {cloudnetpy-1.69.10 → cloudnetpy-1.70.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cloudnetpy
3
- Version: 1.69.10
3
+ Version: 1.70.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -24,13 +24,14 @@ SEC_IN_HOUR: Final = 3600
24
24
  SEC_IN_DAY: Final = 86400
25
25
  MM_TO_M: Final = 1e-3
26
26
  G_TO_KG: Final = 1e-3
27
+ M_TO_KM: Final = 1e-3
27
28
  KG_TO_G: Final = 1e3
29
+ M_TO_MM: Final = 1e3
28
30
  M_S_TO_MM_H: Final = SEC_IN_HOUR / MM_TO_M
29
31
  MM_H_TO_M_S: Final = 1 / M_S_TO_MM_H
30
32
  GHZ_TO_HZ: Final = 1e9
31
33
  HPA_TO_PA: Final = 100
32
34
  PA_TO_HPA: Final = 1 / HPA_TO_PA
33
35
  KM_H_TO_M_S: Final = 1000 / SEC_IN_HOUR
34
- M_TO_KM: Final = 1e-3
35
36
  TWO_WAY: Final = 2
36
37
  G: Final = 9.80665
@@ -213,6 +213,26 @@ ATTRIBUTES = {
213
213
  ),
214
214
  },
215
215
  "fallback": {
216
+ "nubf": PlotMeta(plot_range=(0, 5)),
217
+ "ze_sat": PlotMeta(
218
+ plot_range=(-40, 15),
219
+ ),
220
+ "vm_sat": PlotMeta(
221
+ cmap="RdBu_r",
222
+ plot_range=(-4, 4),
223
+ ),
224
+ "vm_sat_folded": PlotMeta(
225
+ cmap="RdBu_r",
226
+ plot_range=(-4, 4),
227
+ ),
228
+ "vm_sat_noise": PlotMeta(
229
+ cmap="RdBu_r",
230
+ plot_range=(-4, 4),
231
+ ),
232
+ "vm_sat_vel": PlotMeta(
233
+ cmap="RdBu_r",
234
+ plot_range=(-4, 4),
235
+ ),
216
236
  "ier": PlotMeta(
217
237
  plot_range=(2e-5, 6e-5),
218
238
  ),
@@ -27,6 +27,8 @@ from cloudnetpy.exceptions import PlottingError
27
27
  from cloudnetpy.instruments.ceilometer import calc_sigma_units
28
28
  from cloudnetpy.plotting.plot_meta import ATTRIBUTES, PlotMeta
29
29
 
30
+ EARTHCARE_MAX_X = 517.84
31
+
30
32
 
31
33
  @dataclass
32
34
  class PlotParameters:
@@ -116,8 +118,9 @@ class FigureData:
116
118
  requested_variables
117
119
  )
118
120
  self.options = options
121
+ self.file_type = getattr(self.file, "cloudnet_file_type", "")
119
122
  self.height = self._get_height()
120
- self.time = self.file.variables["time"][:]
123
+ self.time = self._get_time()
121
124
  self.time_including_gaps = np.array([])
122
125
 
123
126
  def initialize_figure(self) -> tuple[Figure, list[Axes]]:
@@ -171,16 +174,25 @@ class FigureData:
171
174
  raise PlottingError(msg)
172
175
  return valid_variables, variable_indices
173
176
 
177
+ def _get_time(self) -> ndarray:
178
+ if self.file_type == "cpr-simulation":
179
+ x_data = self.file.variables["along_track_sat"][:] * con.M_TO_KM
180
+ else:
181
+ x_data = self.file.variables["time"][:]
182
+ return x_data
183
+
174
184
  def _get_height(self) -> ndarray | None:
175
- m2km = 1e-3
176
- m2mm = 1e3
177
- file_type = getattr(self.file, "cloudnet_file_type", "")
178
- if file_type == "model":
185
+ if self.file_type == "cpr-simulation":
186
+ height = self.file.variables["height_sat"][:]
187
+ if self.options.plot_above_ground:
188
+ height -= self.file.variables["altitude"][:]
189
+ return height * con.M_TO_KM
190
+ if self.file_type == "model":
179
191
  height = ma.mean(self.file.variables["height"][:], axis=0) # height AGL
180
192
  if not self.options.plot_above_ground:
181
193
  site_alt = self._calc_ground_altitude()
182
194
  height += site_alt
183
- return height * m2km
195
+ return height * con.M_TO_KM
184
196
  if "height" in self.file.variables:
185
197
  height = self.file.variables["height"][:] # height AMSL
186
198
  if self.options.plot_above_ground:
@@ -188,11 +200,11 @@ class FigureData:
188
200
  msg = "No altitude information in the file."
189
201
  raise ValueError(msg)
190
202
  height -= self.file.variables["altitude"][:]
191
- return height * m2km
203
+ return height * con.M_TO_KM
192
204
  if "range" in self.file.variables:
193
- return self.file.variables["range"][:] * m2km
205
+ return self.file.variables["range"][:] * con.M_TO_KM
194
206
  if "diameter" in self.file.variables:
195
- return self.file.variables["diameter"][:] * m2mm
207
+ return self.file.variables["diameter"][:] * con.M_TO_MM
196
208
  return None
197
209
 
198
210
  def _calc_ground_altitude(self) -> float:
@@ -206,8 +218,7 @@ class FigureData:
206
218
  return calc_altitude(temperature, pressure)
207
219
 
208
220
  def is_mwrpy_product(self) -> bool:
209
- cloudnet_file_type = getattr(self.file, "cloudnet_file_type", "")
210
- return cloudnet_file_type in ("mwr-single", "mwr-multi")
221
+ return self.file_type in ("mwr-single", "mwr-multi")
211
222
 
212
223
  def __len__(self) -> int:
213
224
  return len(self.variables)
@@ -228,6 +239,9 @@ class SubPlot:
228
239
  self.plot_meta = self._read_plot_meta()
229
240
 
230
241
  def set_xax(self) -> None:
242
+ if self.file_type == "cpr-simulation":
243
+ self.ax.set_xlim(0, EARTHCARE_MAX_X) # km
244
+ return
231
245
  resolution = 4
232
246
  x_tick_labels = [
233
247
  f"{int(i):02d}:00"
@@ -294,7 +308,12 @@ class SubPlot:
294
308
  )
295
309
 
296
310
  def set_xlabel(self) -> None:
297
- self.ax.set_xlabel("Time (UTC)", fontsize=13)
311
+ label = (
312
+ "Distance along track (km)"
313
+ if self.file_type == "cpr-simulation"
314
+ else "Time (UTC)"
315
+ )
316
+ self.ax.set_xlabel(label, fontsize=13)
298
317
 
299
318
  def show_footer(self, fig: Figure, ax: Axes) -> None:
300
319
  if isinstance(self.options.footer_text, str):
@@ -387,18 +406,23 @@ class Plot:
387
406
  zorder=_get_zorder("data_gap"),
388
407
  )
389
408
 
390
- def _mark_gaps(self, figure_data: FigureData) -> None:
409
+ def _mark_gaps(
410
+ self, figure_data: FigureData, min_x: float = 0, max_x: float = 24
411
+ ) -> None:
391
412
  time = figure_data.time
392
- data = self._data
393
- if time[0] < 0 or time[-1] > 24:
394
- msg = "Time values outside the range 0-24."
413
+
414
+ if time[0] < min_x or time[-1] > max_x:
415
+ msg = f"x-axis values outside the range {min_x}-{max_x}."
395
416
  raise ValueError(msg)
396
417
  max_gap_fraction_hour = _get_max_gap_in_minutes(figure_data) / 60
397
418
 
398
- if getattr(figure_data.file, "cloudnet_file_type", "") == "model":
419
+ data = self._data
420
+
421
+ if self.sub_plot.file_type == "model":
399
422
  time, data = screen_completely_masked_profiles(time, data)
400
423
 
401
424
  gap_indices = np.where(np.diff(time) > max_gap_fraction_hour)[0]
425
+
402
426
  if not ma.is_masked(data):
403
427
  mask_new = np.zeros(data.shape)
404
428
  elif ma.all(data.mask) is ma.masked:
@@ -420,16 +444,16 @@ class Plot:
420
444
  mask_new = np.insert(mask_new, ind_gap, temp_mask, axis=0)
421
445
  time_new = np.insert(time_new, ind_gap, time[ind_gap] - time_delta)
422
446
  time_new = np.insert(time_new, ind_gap, time[ind_gap - 1] + time_delta)
423
- if (time[0] - 0) > max_gap_fraction_hour:
447
+ if (time[0] - min_x) > max_gap_fraction_hour:
424
448
  data_new = np.insert(data_new, 0, temp_array, axis=0)
425
449
  mask_new = np.insert(mask_new, 0, temp_mask, axis=0)
426
450
  time_new = np.insert(time_new, 0, time[0] - time_delta)
427
451
  time_new = np.insert(time_new, 0, time_delta)
428
- if (24 - time[-1]) > max_gap_fraction_hour:
452
+ if (max_x - time[-1]) > max_gap_fraction_hour:
429
453
  ind_gap = mask_new.shape[0]
430
454
  data_new = np.insert(data_new, ind_gap, temp_array, axis=0)
431
455
  mask_new = np.insert(mask_new, ind_gap, temp_mask, axis=0)
432
- time_new = np.insert(time_new, ind_gap, 24 - time_delta)
456
+ time_new = np.insert(time_new, ind_gap, max_x - time_delta)
433
457
  time_new = np.insert(time_new, ind_gap, time[-1] + time_delta)
434
458
  data_new.mask = mask_new
435
459
  self._data = data_new
@@ -451,7 +475,11 @@ class Plot:
451
475
  class Plot2D(Plot):
452
476
  def plot(self, figure_data: FigureData):
453
477
  self._convert_units()
454
- self._mark_gaps(figure_data)
478
+ if figure_data.file_type == "cpr-simulation":
479
+ min_x, max_x = 0, EARTHCARE_MAX_X
480
+ else:
481
+ min_x, max_x = 0, 24
482
+ self._mark_gaps(figure_data, min_x=min_x, max_x=max_x)
455
483
  if self.sub_plot.variable.name == "cloud_fraction":
456
484
  self._data[self._data == 0] = ma.masked
457
485
  if any(
@@ -952,6 +980,7 @@ def _get_max_gap_in_minutes(figure_data: FigureData) -> float:
952
980
  "doppler-lidar-wind": 75,
953
981
  "doppler-lidar": 75,
954
982
  "radar": 5,
983
+ "cpr-simulation": 60,
955
984
  }
956
985
  return max_allowed_gap.get(file_type, 10)
957
986
 
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 69
3
- PATCH = 10
2
+ MINOR = 70
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.69.10
3
+ Version: 1.70.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