cloudnetpy 1.69.10__tar.gz → 1.70.0__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.
- {cloudnetpy-1.69.10/cloudnetpy.egg-info → cloudnetpy-1.70.0}/PKG-INFO +1 -1
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/constants.py +2 -1
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/plotting/plot_meta.py +8 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/plotting/plotting.py +50 -21
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/version.py +2 -2
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0/cloudnetpy.egg-info}/PKG-INFO +1 -1
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/LICENSE +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/MANIFEST.in +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/README.md +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/atmos_utils.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuation.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/categorize.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/classify.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/containers.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/disdrometer.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/droplet.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/falling.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/freezing.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/insects.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/itu.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/lidar.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/melting.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/model.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/mwr.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/radar.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/cli.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/cloudnetarray.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/concat_lib.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/datasource.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/exceptions.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/basta.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/campbell_scientific.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/ceilo.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/ceilometer.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/cl61d.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/copernicus.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/disdrometer/common.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/galileo.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/hatpro.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/instruments.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/lufft.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/mira.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/mrr.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/nc_lidar.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/nc_radar.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/pollyxt.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/radiometrics.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/rain_e_h3.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/rpg.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/rpg_reader.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/toa5.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/vaisala.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/instruments/weather_station.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/metadata.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/file_handler.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/metadata.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/utils.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/output.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/plotting/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/__init__.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/classification.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/der.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/drizzle.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/drizzle_error.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/drizzle_tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/ier.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/iwc.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/lwc.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/mie_lu_tables.nc +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/mwr_tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/products/product_tools.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/py.typed +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/utils.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy.egg-info/SOURCES.txt +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy.egg-info/dependency_links.txt +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy.egg-info/entry_points.txt +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy.egg-info/requires.txt +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy.egg-info/top_level.txt +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/docs/source/conf.py +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/pyproject.toml +0 -0
- {cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/setup.cfg +0 -0
@@ -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,14 @@ 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
|
+
),
|
216
224
|
"ier": PlotMeta(
|
217
225
|
plot_range=(2e-5, 6e-5),
|
218
226
|
),
|
@@ -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.
|
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
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
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 *
|
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 *
|
203
|
+
return height * con.M_TO_KM
|
192
204
|
if "range" in self.file.variables:
|
193
|
-
return self.file.variables["range"][:] *
|
205
|
+
return self.file.variables["range"][:] * con.M_TO_KM
|
194
206
|
if "diameter" in self.file.variables:
|
195
|
-
return self.file.variables["diameter"][:] *
|
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
|
-
|
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
|
-
|
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(
|
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
|
-
|
393
|
-
if time[0] <
|
394
|
-
msg = "
|
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
|
-
|
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] -
|
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 (
|
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,
|
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
|
-
|
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
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/gas_attenuation.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/liquid_attenuation.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/melting_attenuation.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/categorize/attenuations/rain_attenuation.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/advance_methods.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/grid_methods.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/model_products.py
RENAMED
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/products/product_resampling.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py
RENAMED
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py
RENAMED
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py
RENAMED
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py
RENAMED
File without changes
|
File without changes
|
{cloudnetpy-1.69.10 → cloudnetpy-1.70.0}/cloudnetpy/model_evaluation/tests/unit/test_tools.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|