cloudnetpy 1.80.0__py3-none-any.whl → 1.80.2__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.
@@ -145,10 +145,11 @@ def generate_categorize(
145
145
  return utils.time_grid(), data.radar.height
146
146
 
147
147
  def _close_all() -> None:
148
- for field in fields(data):
149
- obj = getattr(data, field.name)
150
- if isinstance(obj, DataSource):
151
- obj.close()
148
+ if "data" in locals():
149
+ for field in fields(data):
150
+ obj = getattr(data, field.name)
151
+ if isinstance(obj, DataSource):
152
+ obj.close()
152
153
 
153
154
  try:
154
155
  radar = Radar(input_files["radar"])
@@ -121,6 +121,7 @@ def ceilo2nc(
121
121
  ceilo_obj.data["depolarisation"].mask = ceilo_obj.data["beta"].mask
122
122
  ceilo_obj.screen_depol()
123
123
  ceilo_obj.screen_invalid_values()
124
+ ceilo_obj.screen_sunbeam()
124
125
  ceilo_obj.prepare_data()
125
126
  ceilo_obj.data_to_cloudnet_arrays()
126
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__(
@@ -122,12 +122,15 @@ class RadiometricsMP:
122
122
  logging.info("Skipping unknown record type %d", record_type)
123
123
  unknown_record_types.add(record_type)
124
124
  continue
125
+
126
+ row_trimmed = [value for value in row if value != ""]
127
+
125
128
  record = Record(
126
129
  row_number=int(row[0]),
127
130
  timestamp=_parse_datetime(row[1]),
128
131
  block_type=block_type,
129
132
  block_index=block_index,
130
- values=dict(zip(column_names, row[3:], strict=True)),
133
+ values=dict(zip(column_names, row_trimmed[3:], strict=True)),
131
134
  )
132
135
  rows.append(record)
133
136
 
@@ -157,7 +160,7 @@ class RadiometricsMP:
157
160
  # "LV2 Processor" values "Zenith" and "0.00:90.00" should be OK
158
161
  # but "Angle20(N)" and similar should be skipped.
159
162
  proc = record.values["LV2 Processor"]
160
- if proc.startswith("Angle"):
163
+ if proc.startswith(("Angle", "Zenith26")):
161
164
  skip_procs.add(proc)
162
165
  continue
163
166
  if title == "Temperature (K)":
@@ -204,6 +207,7 @@ class RadiometricsMP:
204
207
  times.append(record.timestamp)
205
208
  lwps.append(float(lwp))
206
209
  iwvs.append(float(iwv))
210
+
207
211
  self.data["time"] = np.array(times, dtype="datetime64[s]")
208
212
  self.data["lwp"] = np.array(lwps) # mm => kg m-2
209
213
  self.data["iwv"] = np.array(iwvs) * 10 # cm => kg m-2
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 80
3
- PATCH = 0
3
+ PATCH = 2
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.80.0
3
+ Version: 1.80.2
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -9,11 +9,11 @@ cloudnetpy/metadata.py,sha256=lO7BCbVAzFoH3Nq-VuezYX0f7MnbG1Zp11g5GSiuQwM,6189
9
9
  cloudnetpy/output.py,sha256=gupxt4f_-eUrFsWMto8tnknoV-p9QauC9L6CJAqBILU,15988
10
10
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  cloudnetpy/utils.py,sha256=WczDeGN408XSgGeaRLXFmlLjgAS67lK1osV0YEuKmwo,32027
12
- cloudnetpy/version.py,sha256=3SiH4gJlcuEOGDz63kQkJlurcgqt5RcwIPvPtt8WVKg,72
12
+ cloudnetpy/version.py,sha256=7zXWRL5tx8CR6R5neJyk3PXzFjoph6dombYnU9CqKUI,72
13
13
  cloudnetpy/categorize/__init__.py,sha256=s-SJaysvVpVVo5kidiruWQO6p3gv2TXwY1wEHYO5D6I,44
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=RcmbKxm2COkE7WEya0mK3yX5rzUbrewRVh3ekm01RtM,10598
15
15
  cloudnetpy/categorize/attenuation.py,sha256=Y_-fzmQTltWTqIZTulJhovC7a6ifpMcaAazDJcnMIOc,990
16
- cloudnetpy/categorize/categorize.py,sha256=PzkgQ63MtEHlz_0govFkoM6F41OKgQLsxDh7GLQHyrs,20777
16
+ cloudnetpy/categorize/categorize.py,sha256=E3WAG79UGRLsDK3ZfaRfk7Vedht4OMxSgjHOPVBqrS4,20824
17
17
  cloudnetpy/categorize/classify.py,sha256=qovHgHsMku5kpl3cJxKteNBsG8GAkfI3Zo8QhJwZSFQ,8512
18
18
  cloudnetpy/categorize/containers.py,sha256=9nAmI1OnR_uANyTZS1cD4do6NrC90EqliEMVrFnQY24,5398
19
19
  cloudnetpy/categorize/disdrometer.py,sha256=sRSt2B932lrrkvycKoSaKEIaDVfq9Z7uU-4iHRr-fC0,1893
@@ -35,8 +35,8 @@ cloudnetpy/categorize/attenuations/rain_attenuation.py,sha256=qazJzRyXf9vbjJhh4y
35
35
  cloudnetpy/instruments/__init__.py,sha256=PEgrrQNoiOuN_ctYilmt4LV2QCLg1likPjJdWtuGlLs,528
36
36
  cloudnetpy/instruments/basta.py,sha256=Lb_EhQTI93S5Bd9osDbCE_tC8gZreRsHz7D2_dFOjmE,3793
37
37
  cloudnetpy/instruments/bowtie.py,sha256=EyE8HAE8rjO7JelJDbQte_rnwE3VoVJVc6TBpSNK3IU,3930
38
- cloudnetpy/instruments/ceilo.py,sha256=gHCh8222Csso9JOaE2f9r5ydzq_DJv112M8qMBVBFcI,10442
39
- cloudnetpy/instruments/ceilometer.py,sha256=XS2hVJ7rn9WOUKq19wpNL5MJr59fKSEWHC_1pOE_Bm4,12323
38
+ cloudnetpy/instruments/ceilo.py,sha256=arXI7i8UiTVIk4N1P8Mnpgs_oXN79ReeBjpYuqqwL04,10473
39
+ cloudnetpy/instruments/ceilometer.py,sha256=8DzOUC7PUZYLfCC9t9LA5YSsF78xs4B4VjBLx6S-wDE,12980
40
40
  cloudnetpy/instruments/cl61d.py,sha256=0QMqXHIy0hn2mksAwTdaKMOaEWjsZmj7QZ8hCbcHwxE,2225
41
41
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=SGPsRYYoGPoRoDY7hHJcKUVX0A23X0Telc00Fu01PnY,4495
42
42
  cloudnetpy/instruments/copernicus.py,sha256=hCphEKyFCc3f1uLRdjL2435kuh64M5q-V1bI68bzGbA,6528
@@ -50,7 +50,7 @@ cloudnetpy/instruments/mrr.py,sha256=eeAzCp3CiHGauywjwvMUAFwZ4vBOZMcd3IlF8KsrLQo
50
50
  cloudnetpy/instruments/nc_lidar.py,sha256=5gQG9PApnNPrHmS9_zanl8HEYIQuGRpbnzC3wfTcOyQ,1705
51
51
  cloudnetpy/instruments/nc_radar.py,sha256=HlaZeH5939R86ukF8K-P4Kfzb5-CpLB15LU2u94C5eI,7330
52
52
  cloudnetpy/instruments/pollyxt.py,sha256=U3g-ttmcs02LuLwVOydP3GjeNcmDyoYQroB-leIGdHY,10060
53
- cloudnetpy/instruments/radiometrics.py,sha256=_ZBHYiw3u4m0UDPaYRHnx-ofq2FS59Vdv3-fLiOzm9I,15471
53
+ cloudnetpy/instruments/radiometrics.py,sha256=H-tAyCCT53GjODQuDxIx8NFuZazm8BNPt5gHEuxjRxg,15570
54
54
  cloudnetpy/instruments/rain_e_h3.py,sha256=JEg4Ko7ZdfjAUJwJ1BWdTkm4K7r3s8WKrPb-HidTqpg,5336
55
55
  cloudnetpy/instruments/rpg.py,sha256=m3-xLJ-w2T7Ip7jBveWsGrts4tmNvdc-Lb4HebvHQjQ,17319
56
56
  cloudnetpy/instruments/rpg_reader.py,sha256=ThztFuVrWxhmWVAfZTfQDeUiKK1XMTbtv08IBe8GK98,11364
@@ -117,10 +117,10 @@ cloudnetpy/products/lwc.py,sha256=sl6Al2tuH3KkCBrPbWTmuz3jlD5UQJ4D6qBsn1tt2CQ,18
117
117
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
118
118
  cloudnetpy/products/mwr_tools.py,sha256=8HPZpQMTojKZP1JS1S83IE0sxmbDE9bxlaWoqmGnUZE,6199
119
119
  cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
120
- cloudnetpy-1.80.0.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
120
+ cloudnetpy-1.80.2.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
121
121
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
122
- cloudnetpy-1.80.0.dist-info/METADATA,sha256=fk5uizRi5azdU4nz8DQRzMMuOSvlEbR_ZW19xbXvOvI,5803
123
- cloudnetpy-1.80.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
- cloudnetpy-1.80.0.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
- cloudnetpy-1.80.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
- cloudnetpy-1.80.0.dist-info/RECORD,,
122
+ cloudnetpy-1.80.2.dist-info/METADATA,sha256=coxvAU-k7KsWoNiet_mhP3Y5NJ8JcqoWBvoDLXQkwhs,5803
123
+ cloudnetpy-1.80.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
124
+ cloudnetpy-1.80.2.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
125
+ cloudnetpy-1.80.2.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
126
+ cloudnetpy-1.80.2.dist-info/RECORD,,