cloudnetpy 1.58.7__py3-none-any.whl → 1.59.0__py3-none-any.whl

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/datasource.py CHANGED
@@ -84,6 +84,7 @@ class DataSource:
84
84
  key: str,
85
85
  name: str | None = None,
86
86
  units: str | None = None,
87
+ dtype: str | None = None,
87
88
  ) -> None:
88
89
  """Adds new CloudnetVariable or RadarVariable into `data` attribute.
89
90
 
@@ -95,7 +96,7 @@ class DataSource:
95
96
  units: CloudnetArray.units attribute.
96
97
 
97
98
  """
98
- self.data[key] = CloudnetArray(variable, name or key, units)
99
+ self.data[key] = CloudnetArray(variable, name or key, units, data_type=dtype)
99
100
 
100
101
  def get_date(self) -> list:
101
102
  """Returns date components.
cloudnetpy/exceptions.py CHANGED
@@ -56,3 +56,10 @@ class MissingInputFileError(CloudnetException):
56
56
 
57
57
  def __init__(self, msg: str = "Missing required input files"):
58
58
  super().__init__(msg)
59
+
60
+
61
+ class HatproDataError(CloudnetException):
62
+ """Internal exception class."""
63
+
64
+ def __init__(self, msg: str = "Invalid HATPRO file"):
65
+ super().__init__(msg)
@@ -54,7 +54,7 @@ def basta2nc(
54
54
  if date is not None:
55
55
  basta.validate_date(date)
56
56
  basta.screen_data(keymap)
57
- basta.add_time_and_range()
57
+ basta.add_time_and_range(time_dtype="f8")
58
58
  basta.add_site_geolocation()
59
59
  basta.add_zenith_angle()
60
60
  basta.add_radar_specific_variables()
@@ -171,6 +171,8 @@ class Disdrometer(CloudnetInstrument):
171
171
  )
172
172
  for time_ind, row in enumerate(self._file_data["spectra"]):
173
173
  values = _parse_int(row)
174
+ if len(values) != self.n_diameter * self.n_velocity:
175
+ continue
174
176
  array[time_ind, :, :] = np.reshape(
175
177
  values,
176
178
  (self.n_diameter, self.n_velocity),
@@ -6,6 +6,7 @@ from pathlib import Path
6
6
 
7
7
  import netCDF4
8
8
  import numpy as np
9
+ from mwrpy.exceptions import MissingInputData
9
10
  from mwrpy.level1.lev1_meta_nc import ATTRIBUTES_1B01
10
11
  from mwrpy.level1.write_lev1_nc import lev1_to_nc
11
12
  from mwrpy.version import __version__ as mwrpy_version
@@ -13,7 +14,7 @@ from numpy import ma
13
14
 
14
15
  from cloudnetpy import output, utils
15
16
  from cloudnetpy.cloudnetarray import CloudnetArray
16
- from cloudnetpy.exceptions import ValidTimeStampError
17
+ from cloudnetpy.exceptions import HatproDataError, ValidTimeStampError
17
18
  from cloudnetpy.instruments import rpg
18
19
  from cloudnetpy.instruments.instruments import HATPRO
19
20
  from cloudnetpy.instruments.rpg_reader import (
@@ -45,13 +46,16 @@ def hatpro2l1c(
45
46
  """
46
47
  coeff_files = site_meta.get("coefficientFiles", None)
47
48
 
48
- hatpro_raw = lev1_to_nc(
49
- "1C01",
50
- mwr_dir,
51
- output_file=output_file,
52
- coeff_files=coeff_files,
53
- instrument_config=site_meta,
54
- )
49
+ try:
50
+ hatpro_raw = lev1_to_nc(
51
+ "1C01",
52
+ mwr_dir,
53
+ output_file=output_file,
54
+ coeff_files=coeff_files,
55
+ instrument_config=site_meta,
56
+ )
57
+ except MissingInputData as err:
58
+ raise HatproDataError from err
55
59
 
56
60
  hatpro = HatproL1c(hatpro_raw, site_meta)
57
61
 
@@ -68,6 +72,9 @@ def hatpro2l1c(
68
72
  if len(set(dates)) != 1:
69
73
  msg = f"Several dates, something is wrong: {set(dates)}"
70
74
  raise RuntimeError(msg)
75
+ if date != dates[0]:
76
+ msg = f"Expected date {date}, got {dates[0]}"
77
+ raise RuntimeError(msg)
71
78
 
72
79
  decimal_hours = utils.seconds2hours(timestamps)
73
80
  hatpro.data["time"] = CloudnetArray(decimal_hours, "time", data_type="f8")
@@ -46,14 +46,14 @@ class NcRadar(DataSource, CloudnetInstrument):
46
46
  array[~np.isfinite(array)] = ma.masked
47
47
  self.append_data(array, name)
48
48
 
49
- def add_time_and_range(self) -> None:
49
+ def add_time_and_range(self, time_dtype: str | None = None) -> None:
50
50
  """Adds time and range."""
51
51
  range_instru = np.array(
52
52
  self.getvar("range", "height"),
53
53
  ) # "height" in old BASTA files
54
54
  time = np.array(self.time)
55
55
  self.append_data(range_instru, "range")
56
- self.append_data(time, "time")
56
+ self.append_data(time, "time", dtype=time_dtype)
57
57
 
58
58
  def screen_by_snr(self, snr_limit: float = -17) -> None:
59
59
  """Mask values where SNR smaller than threshold."""
@@ -94,13 +94,15 @@ class VaisalaCeilo(Ceilometer):
94
94
  raise RuntimeError(msg)
95
95
 
96
96
  def _parse_data_lines(data: list, starting_indices: list) -> list:
97
+ iterator = range(number_of_data_lines)
98
+ n_lines = max(iterator)
97
99
  return [
98
100
  [
99
101
  data[n + line_number]
100
102
  for n in starting_indices
101
- if (n + line_number) < len(data)
103
+ if (n + n_lines) < len(data)
102
104
  ]
103
- for line_number in range(number_of_data_lines)
105
+ for line_number in iterator
104
106
  ]
105
107
 
106
108
  valid_lines = _filter_lines(data_in)
@@ -276,10 +276,18 @@ ATTRIBUTES = {
276
276
  cmap="RdBu_r",
277
277
  plot_range=(-50, 50),
278
278
  ),
279
+ "uwind_raw": PlotMeta(
280
+ cmap="RdBu_r",
281
+ plot_range=(-50, 50),
282
+ ),
279
283
  "vwind": PlotMeta(
280
284
  cmap="RdBu_r",
281
285
  plot_range=(-50, 50),
282
286
  ),
287
+ "vwind_raw": PlotMeta(
288
+ cmap="RdBu_r",
289
+ plot_range=(-50, 50),
290
+ ),
283
291
  "temperature": PlotMeta(
284
292
  cmap="RdBu_r",
285
293
  plot_range=(223.15, 323.15),
@@ -818,6 +818,7 @@ def _get_max_gap_in_minutes(figure_data: FigureData) -> float:
818
818
  "model": 181 if "gdas1" in source else 61,
819
819
  "mwr-multi": 21,
820
820
  "weather-station": 12,
821
+ "doppler-lidar-wind": 75,
821
822
  }
822
823
  return max_allowed_gap.get(file_type, 10)
823
824
 
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 58
3
- PATCH = 7
2
+ MINOR = 59
3
+ PATCH = 0
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.58.7
3
+ Version: 1.59.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -2,13 +2,13 @@ cloudnetpy/__init__.py,sha256=X_FqY-4yg5GUj5Edo14SToLEos6JIsC3fN-v1FUgQoA,43
2
2
  cloudnetpy/cloudnetarray.py,sha256=HT6bLtjnimOVbGrdjQBqD0F8GW0KWkn2qhaIGFMKLAY,6987
3
3
  cloudnetpy/concat_lib.py,sha256=YK5ho5msqwNxpPtPT8f2OewIJ8hTrbhCkaxHaBKLTI0,9809
4
4
  cloudnetpy/constants.py,sha256=l7_ohQgLEQ6XEG9AMBarTPKp9OM8B1ElJ6fSN0ScdmM,733
5
- cloudnetpy/datasource.py,sha256=-6oLC5bsn9sIoaN0glV88owFyTeGRsW1ZVJSV8rM5rE,7813
6
- cloudnetpy/exceptions.py,sha256=nA6YieylwKSp5KQOh3DhhcTmUBsd0tBZnedgmlWck-w,1415
5
+ cloudnetpy/datasource.py,sha256=CSiKQGVEX459tagRjLrww6hZMZcc3r1sR2WcaTKTTWo,7864
6
+ cloudnetpy/exceptions.py,sha256=wrI0bZTwmS5C_cqOmvlJ8XJSEFyzuD1eD4voGJc_Gjg,1584
7
7
  cloudnetpy/metadata.py,sha256=v_VDo2vbdTxB0zIsfP69IcrwSKiRlLpsGdq6JPI4CoA,5306
8
8
  cloudnetpy/output.py,sha256=WoVTNuxni0DUr163vZ-_mDr1brXhY15XSlGMrq9Aoqw,14700
9
9
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  cloudnetpy/utils.py,sha256=0TlHm71YtSrKXBsRKctitnhQrvZPE-ulEVeAQW-oK58,27398
11
- cloudnetpy/version.py,sha256=fCzCKWKXQ8ynaDbE6paHMwP1PHAclXkxoRdpRVx8GL0,72
11
+ cloudnetpy/version.py,sha256=DkkxQi_uj1U2LdUPcX5cgnaQF9gFRAyTNo0STBHjTXc,72
12
12
  cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
13
13
  cloudnetpy/categorize/atmos.py,sha256=fWW8ye_8HZASRAiYwURFKWzcGOYIA2RKeVxCq0lVOuM,12389
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=wndpwJxc2-QnNTkV8tc8I11Vs_WkNz9sVMX1fuGgUC4,3777
@@ -26,7 +26,7 @@ cloudnetpy/categorize/model.py,sha256=xWB6XOSz9p0h4b4m6ImMmzcTImOmz54d093WmsLogd
26
26
  cloudnetpy/categorize/mwr.py,sha256=-KMoYlch_C79bqgcEiRDCTRCcQf1ZsYxU90GQ8hzMgs,1435
27
27
  cloudnetpy/categorize/radar.py,sha256=S3561FVK6J4NUjqPi2S6fKnjnOm0oLwbIC54J64AN4Y,13659
28
28
  cloudnetpy/instruments/__init__.py,sha256=_jejVwi_viSZehmAOkEqTNI-0-exGgAJ_bHW1IRRwTI,398
29
- cloudnetpy/instruments/basta.py,sha256=OeWBP_5b2xjOzPaFWEFC0irgLhSqX1YdcPkVBRbxd4c,3742
29
+ cloudnetpy/instruments/basta.py,sha256=0zUztUJBXT2nrBTAl3-NLowxu_CYwTU5TgdBq4etj7E,3757
30
30
  cloudnetpy/instruments/campbell_scientific.py,sha256=2WHfBKQjtRSl0AqvtPeX7G8Hdi3Dn0WbvoAppFOMbA8,5270
31
31
  cloudnetpy/instruments/ceilo.py,sha256=eF9Pp3KbYg3I_6gQcgCeobVkHzbbK9T5uH2tUys7RG8,8882
32
32
  cloudnetpy/instruments/ceilometer.py,sha256=SVp3Ego8JIjoTFK0FRvc2Xgq7U9a9iM1n-gL0Z90dv0,11928
@@ -34,21 +34,21 @@ cloudnetpy/instruments/cl61d.py,sha256=ycJGvUqNU2KHhECbrSehtWRnvg1vKFHhvMeQpjpdC
34
34
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=RG5HJxGM6p0F-IGyr85fvOizcMmgx48OeD_XeIsrgSU,3367
35
35
  cloudnetpy/instruments/copernicus.py,sha256=AT0AtMhGSKzPWEqXsfAda6zeaw4g0Jr5dqIyfeu4FP0,6327
36
36
  cloudnetpy/instruments/galileo.py,sha256=FyFYh1JhWed1d6yvpsv3rdBzHUTjkfOPw5HEQz4Wssw,4545
37
- cloudnetpy/instruments/hatpro.py,sha256=y96gMoaKW0pZRgGw1xzEx4UQ0OWeVKfKuyjNiDc2CjU,8221
37
+ cloudnetpy/instruments/hatpro.py,sha256=tvkLfgC7YRa8aECOeN4_UaxrgX_VTKYTjTbRVo1kxLo,8519
38
38
  cloudnetpy/instruments/instruments.py,sha256=GcUEbQFPHUhRTnp300AZ2PK0O2d2EPIGtHqCX6dy99M,3133
39
39
  cloudnetpy/instruments/lufft.py,sha256=nozeiMRMz7I6q_FwmlxDGhWeJlqTuNh6ru39-M4K3BI,3629
40
40
  cloudnetpy/instruments/mira.py,sha256=TfozpYivQAThZ_rV3gLzZpz2QyJFWOF0RXdzA4521rM,9332
41
41
  cloudnetpy/instruments/mrr.py,sha256=hqknXXjJYfjWtyO50vioC3ohmH1GWU7K78-dNHh0Fss,5824
42
42
  cloudnetpy/instruments/nc_lidar.py,sha256=Q4sJJwiEPthDz0Zb-laISX32jNYzlUBMafxLJiOAN5c,1704
43
- cloudnetpy/instruments/nc_radar.py,sha256=LM0itIuwvhcPKSX4B7BojFwHHfAWVI9dY7G_7eVA8us,6886
43
+ cloudnetpy/instruments/nc_radar.py,sha256=cDd20Yz-UeDQp1Gmkk-jGNZ45DangFsCaioeo_kktHQ,6935
44
44
  cloudnetpy/instruments/pollyxt.py,sha256=lbxJCKgKfgTxPm_NyYIWzSi2BbN828fNzI-Rux3wT48,8560
45
45
  cloudnetpy/instruments/radiometrics.py,sha256=oqsEW65DPYuSah58SaphtVVmt0rZqJ7DwqbOlMB-qHc,7620
46
46
  cloudnetpy/instruments/rpg.py,sha256=U8nEOlOI74f2lk2w4C4xKZCrW6AkDZpQZYE3yv7SNHE,17130
47
47
  cloudnetpy/instruments/rpg_reader.py,sha256=LAdXL3TmD5QzQbqtPOcemZji_qkXwmw6a6F8NmF6Zg8,11355
48
- cloudnetpy/instruments/vaisala.py,sha256=E6PaK26lHprqOJUCEDZPZQu83Qan9n_THudTFQM9wgI,14448
48
+ cloudnetpy/instruments/vaisala.py,sha256=GzESZvboOoXzWmmr9dC-y6oM6ogc-M-zT3KmBTaD0LI,14512
49
49
  cloudnetpy/instruments/weather_station.py,sha256=gTY3Y5UATqJo9Gld4hm7WdsKBwcF8WgNTIK2nOfl3Nc,5739
50
50
  cloudnetpy/instruments/disdrometer/__init__.py,sha256=lyjwttWvFvuwYxEkusoAvgRcbBmglmOp5HJOpXUqLWo,93
51
- cloudnetpy/instruments/disdrometer/common.py,sha256=3wlI_nCE3l116anuAvKw-b9WLU2XAK4bZ9XMP4AFADQ,15753
51
+ cloudnetpy/instruments/disdrometer/common.py,sha256=3z2pVgDuUMxM5sIJc-wYhdGYSOUsAG_Mp6MI8mPlJ5w,15843
52
52
  cloudnetpy/instruments/disdrometer/parsivel.py,sha256=TWq8VgG8U75AJQfCX-V2y8qy-nO6dKMOGd2eG8-u7to,22342
53
53
  cloudnetpy/instruments/disdrometer/thies.py,sha256=h7EwZ9tn47UUMiYqDQ68vkXv4q0rEqX1ZeFXd7XJYNg,5050
54
54
  cloudnetpy/model_evaluation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -92,8 +92,8 @@ cloudnetpy/model_evaluation/tests/unit/test_plotting.py,sha256=h9V8JKmrO4v9bOvv-
92
92
  cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V0qbqkpDuaTYvEIbaasl0nZ5gmTLR4eGC0glBQ,9724
93
93
  cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
94
94
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
95
- cloudnetpy/plotting/plot_meta.py,sha256=e0X6ZCuBE0eRIbGKdT7S0RzhL_ncfo7Pi0uRhXpttnQ,14868
96
- cloudnetpy/plotting/plotting.py,sha256=WTxuOJya9d8-wG3dZbdk8BkoVaFu7-T4i-DbpPNnSis,31754
95
+ cloudnetpy/plotting/plot_meta.py,sha256=HkG60l_UFOCy80mu5xoDlGJgeYUcWa1y_HfugaFWZWQ,15074
96
+ cloudnetpy/plotting/plotting.py,sha256=j1OsTDlAhS78w9CUNfPVCH2vhlA3cl3cjC2wlCywqio,31788
97
97
  cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
98
98
  cloudnetpy/products/classification.py,sha256=0E9OUGR3uLCsS1nORwQu0SqW0_8uX7n6LlRcVhtzKw4,7845
99
99
  cloudnetpy/products/der.py,sha256=mam6jWV7A2h8V5WC3DIeFp6ou7UD1JOw9r7h2B0su-s,12403
@@ -107,8 +107,8 @@ cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe5
107
107
  cloudnetpy/products/mwr_tools.py,sha256=PRm5aCULccUehU-Byk55wYhhEHseMjoAjGBu5TSyHao,4621
108
108
  cloudnetpy/products/product_tools.py,sha256=rhx_Ru9FLlQqCNM-awoiHx18-Aq1eBwL9LiUaQoJs6k,10412
109
109
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
110
- cloudnetpy-1.58.7.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
111
- cloudnetpy-1.58.7.dist-info/METADATA,sha256=qXDYbl0qTaOLAooXRoKMFM5-JZhd-LKpPQRNcKZgLtQ,5784
112
- cloudnetpy-1.58.7.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
113
- cloudnetpy-1.58.7.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
114
- cloudnetpy-1.58.7.dist-info/RECORD,,
110
+ cloudnetpy-1.59.0.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
111
+ cloudnetpy-1.59.0.dist-info/METADATA,sha256=1tsPojx2WLeOKMm_7_RJHpCzjDc14BLU1e5m0ij7W-Q,5784
112
+ cloudnetpy-1.59.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
113
+ cloudnetpy-1.59.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
114
+ cloudnetpy-1.59.0.dist-info/RECORD,,