cloudnetpy 1.65.3__py3-none-any.whl → 1.65.5__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.
@@ -1,13 +1,8 @@
1
- from typing import Final
2
-
3
1
  import numpy as np
4
2
  from numpy import ma
5
3
 
6
4
  import cloudnetpy.constants as con
7
5
 
8
- HPA_TO_P: Final = 100
9
- P_TO_HPA: Final = 0.01
10
-
11
6
 
12
7
  def calc_wet_bulb_temperature(model_data: dict) -> np.ndarray:
13
8
  """Returns wet bulb temperature.
@@ -80,7 +75,7 @@ def calc_saturation_vapor_pressure(temperature: np.ndarray) -> np.ndarray:
80
75
  + 0.42873e-3 * (10 ** (4.76955 * (1 - ratio)) - 1)
81
76
  + 0.78614
82
77
  )
83
- ) * HPA_TO_P
78
+ ) * con.HPA_TO_PA
84
79
 
85
80
 
86
81
  def calc_psychrometric_constant(pressure: np.ndarray) -> np.ndarray:
@@ -114,7 +109,7 @@ def calc_dew_point_temperature(vapor_pressure: np.ndarray) -> np.ndarray:
114
109
  """
115
110
  vaisala_parameters_over_water = (6.116441, 7.591386, 240.7263)
116
111
  a, m, tn = vaisala_parameters_over_water
117
- dew_point_celsius = tn / ((m / np.log10(vapor_pressure * P_TO_HPA / a)) - 1)
112
+ dew_point_celsius = tn / ((m / np.log10(vapor_pressure * con.PA_TO_HPA / a)) - 1)
118
113
  return c2k(dew_point_celsius)
119
114
 
120
115
 
@@ -126,8 +121,3 @@ def c2k(temp: np.ndarray) -> np.ndarray:
126
121
  def k2c(temp: np.ndarray) -> np.ndarray:
127
122
  """Converts Kelvins to Celsius."""
128
123
  return ma.array(temp) - 273.15
129
-
130
-
131
- def mmh2ms(data: np.ndarray) -> np.ndarray:
132
- """Converts mm h-1 to m s-1."""
133
- return data / con.SEC_IN_HOUR * con.MM_TO_M
cloudnetpy/constants.py CHANGED
@@ -30,3 +30,6 @@ G_TO_KG: Final = 1e-3
30
30
  M_S_TO_MM_H: Final = SEC_IN_HOUR / MM_TO_M
31
31
  MM_H_TO_M_S: Final = 1 / M_S_TO_MM_H
32
32
  GHZ_TO_HZ: Final = 1e9
33
+ HPA_TO_PA: Final = 100
34
+ PA_TO_HPA: Final = 1 / HPA_TO_PA
35
+ KM_H_TO_M_S: Final = 1000 / SEC_IN_HOUR
@@ -56,7 +56,7 @@ def hatpro2l1c(
56
56
  instrument_config=site_meta,
57
57
  )
58
58
  except MissingInputData as err:
59
- raise HatproDataError from err
59
+ raise HatproDataError(str(err)) from err
60
60
 
61
61
  hatpro = HatproL1c(hatpro_raw, site_meta)
62
62
 
@@ -10,9 +10,8 @@ from numpy import ma
10
10
  from rpgpy import RPGFileError
11
11
 
12
12
  from cloudnetpy import output, utils
13
- from cloudnetpy.categorize.atmos_utils import mmh2ms
14
13
  from cloudnetpy.cloudnetarray import CloudnetArray
15
- from cloudnetpy.constants import G_TO_KG
14
+ from cloudnetpy.constants import G_TO_KG, HPA_TO_PA, KM_H_TO_M_S, MM_H_TO_M_S
16
15
  from cloudnetpy.exceptions import InconsistentDataError, ValidTimeStampError
17
16
  from cloudnetpy.instruments import instruments
18
17
  from cloudnetpy.instruments.cloudnet_instrument import CloudnetInstrument
@@ -307,8 +306,11 @@ class Fmcw(Rpg):
307
306
 
308
307
  def convert_units(self) -> None:
309
308
  """Converts units."""
310
- self.data["rainfall_rate"].data = mmh2ms(self.data["rainfall_rate"].data)
309
+ self.data["rainfall_rate"].data = self.data["rainfall_rate"].data * MM_H_TO_M_S
311
310
  self.data["lwp"].data *= G_TO_KG
311
+ self.data["relative_humidity"].data /= 100
312
+ self.data["air_pressure"].data *= HPA_TO_PA
313
+ self.data["wind_speed"].data *= KM_H_TO_M_S
312
314
 
313
315
  @staticmethod
314
316
  def _get_instrument(data: dict):
@@ -71,8 +71,8 @@ class Fmcw94Bin:
71
71
  "QF": "quality_flag",
72
72
  "RR": "rainfall_rate",
73
73
  "RelHum": "relative_humidity",
74
- "EnvTemp": "temperature",
75
- "BaroP": "pressure",
74
+ "EnvTemp": "air_temperature",
75
+ "BaroP": "air_pressure",
76
76
  "WS": "wind_speed",
77
77
  "WD": "wind_direction",
78
78
  "DDVolt": "voltage",
@@ -8,7 +8,7 @@ from numpy import ma
8
8
  from cloudnetpy import output
9
9
  from cloudnetpy.categorize import atmos_utils
10
10
  from cloudnetpy.cloudnetarray import CloudnetArray
11
- from cloudnetpy.constants import MM_H_TO_M_S, SEC_IN_HOUR
11
+ from cloudnetpy.constants import HPA_TO_PA, MM_H_TO_M_S, SEC_IN_HOUR
12
12
  from cloudnetpy.exceptions import ValidTimeStampError, WeatherStationDataError
13
13
  from cloudnetpy.instruments import instruments
14
14
  from cloudnetpy.instruments.cloudnet_instrument import CloudnetInstrument
@@ -137,7 +137,7 @@ class WS(CloudnetInstrument):
137
137
  self.data["rainfall_rate"].data = rainfall_rate / 60 / 1000 # mm/min -> m/s
138
138
 
139
139
  def convert_pressure(self) -> None:
140
- self.data["air_pressure"].data = self.data["air_pressure"][:] * 100 # hPa to Pa
140
+ self.data["air_pressure"].data = self.data["air_pressure"][:] * HPA_TO_PA
141
141
 
142
142
  def normalize_rainfall_amount(self) -> None:
143
143
  if "rainfall_amount" in self.data:
@@ -678,29 +678,40 @@ class Plot1D(Plot):
678
678
  def _plot_moving_average(self, figure_data: FigureData) -> None:
679
679
  time = figure_data.time.copy()
680
680
  data = self._data_orig.copy()
681
- good_values = ~ma.getmaskarray(data)
682
- data = data[good_values]
683
- time = time[good_values]
684
- if self.sub_plot.variable.name == "wind_direction":
685
- wind_speed = figure_data.file["wind_speed"][good_values]
686
- sma = self._calculate_average_wind_direction(
687
- wind_speed, data, time, window=15
688
- )
689
- else:
690
- sma = self._calculate_moving_average(data, time, window=5)
691
- gap_time = _get_max_gap_in_minutes(figure_data)
692
- gaps = self._find_time_gap_indices(time, max_gap_min=gap_time)
693
- if len(gaps) > 0:
694
- sma[gaps] = np.nan
695
- if len(sma) == len(time):
696
- self._ax.plot(
697
- time,
698
- sma,
699
- color="slateblue",
700
- lw=2,
701
- label="_nolegend_",
702
- zorder=_get_zorder("mean_curve"),
703
- )
681
+ flags = self._read_flagged_data(figure_data)
682
+ is_invalid = ma.getmaskarray(data)
683
+ if np.any(flags):
684
+ is_invalid |= flags
685
+
686
+ is_wind_direction = self.sub_plot.variable.name == "wind_direction"
687
+ if is_wind_direction:
688
+ data = np.stack([figure_data.file["wind_speed"], data])
689
+
690
+ block_ind = np.where(np.diff(is_invalid))[0] + 1
691
+ valid_time_blocks = np.split(time, block_ind)[is_invalid[0] :: 2]
692
+ valid_data_blocks = np.split(data, block_ind)[is_invalid[0] :: 2]
693
+
694
+ for time1, data1 in zip(valid_time_blocks, valid_data_blocks, strict=False):
695
+ if is_wind_direction:
696
+ sma = self._calculate_average_wind_direction(
697
+ data1[0], data1[1], time1, window=15
698
+ )
699
+ else:
700
+ sma = self._calculate_moving_average(data1, time1, window=5)
701
+ gap_time = _get_max_gap_in_minutes(figure_data)
702
+ gaps = self._find_time_gap_indices(time1, max_gap_min=gap_time) + 1
703
+
704
+ for time2, data2 in zip(
705
+ np.split(time1, gaps), np.split(sma, gaps), strict=False
706
+ ):
707
+ self._ax.plot(
708
+ time2,
709
+ data2,
710
+ color="slateblue",
711
+ lw=2,
712
+ label="_nolegend_",
713
+ zorder=_get_zorder("mean_curve"),
714
+ )
704
715
 
705
716
  @staticmethod
706
717
  def _get_line_width(time: ndarray) -> float:
@@ -736,12 +747,11 @@ class Plot1D(Plot):
736
747
  window_size = int(window / 60 / time_delta_hours)
737
748
  if window_size < 1:
738
749
  window_size = 1
739
- if (window_size % 2) != 0:
750
+ if window_size % 2 == 0:
740
751
  window_size += 1
741
- weights = np.repeat(1.0, window_size) / window_size
742
- sma = np.convolve(data, weights, "valid")
743
- edge = window_size // 2
744
- return np.pad(sma, (edge, edge - 1), mode="constant", constant_values=np.nan)
752
+ weights = np.repeat(1 / window_size, window_size)
753
+ padded_data = np.pad(data, window_size // 2, mode="edge")
754
+ return np.convolve(padded_data, weights, "valid")
745
755
 
746
756
  @classmethod
747
757
  def _calculate_average_wind_direction(
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
2
  MINOR = 65
3
- PATCH = 3
3
+ PATCH = 5
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cloudnetpy
3
- Version: 1.65.3
3
+ Version: 1.65.5
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -1,17 +1,17 @@
1
1
  cloudnetpy/__init__.py,sha256=X_FqY-4yg5GUj5Edo14SToLEos6JIsC3fN-v1FUgQoA,43
2
2
  cloudnetpy/cloudnetarray.py,sha256=Ol1ha4RPAmFZANL__U5CaMKX4oYMXYR6OnjoCZ9w3eo,7077
3
3
  cloudnetpy/concat_lib.py,sha256=8Ek059RMLAfbbXCkX90cgnhw_8ZpcDrxw1yPvwtuitU,9846
4
- cloudnetpy/constants.py,sha256=YVbi2porUnKIzO_PdGeH9pEO9gKa95vDcj6TBMSreoY,734
4
+ cloudnetpy/constants.py,sha256=Kn95HXVMsKFo9Bu-UOYSBJuPEOjBR4JLaEXH0-MBpwk,830
5
5
  cloudnetpy/datasource.py,sha256=j7N4g59HPvOBWle-W9bOUF0BfRLgvR4zwOi_B50cI7Q,7921
6
6
  cloudnetpy/exceptions.py,sha256=ns48useL9RN3mPh7CqIiLA19VI9OmVbyRsKTkwbThF8,1760
7
7
  cloudnetpy/metadata.py,sha256=v_VDo2vbdTxB0zIsfP69IcrwSKiRlLpsGdq6JPI4CoA,5306
8
8
  cloudnetpy/output.py,sha256=YkCaxVkG_Mt2hng_IVnhygHteV4UMKzKALkeFZwFJL8,14822
9
9
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  cloudnetpy/utils.py,sha256=JV0Fawnme1HoZgoiidV3eIzsn6vx0AEjBNmI1CcrBsA,28517
11
- cloudnetpy/version.py,sha256=CjyHHlEJsidNOYLdZ_v5A7dMKPgacxMaMkdY1AxSrrU,72
11
+ cloudnetpy/version.py,sha256=7taBpMQJ9IcUdGe8zT3heZNDf-x-mFFQ3gSVNYJYWjw,72
12
12
  cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
13
13
  cloudnetpy/categorize/atmos.py,sha256=vavMC_WQQyGH14eL4vAzKLKDDZt8tBrMYimztYHOjH8,12639
14
- cloudnetpy/categorize/atmos_utils.py,sha256=64uenj2uxj3P3Blaq_pBN1pBjcF-X4LYNt-uTOjvevg,3778
14
+ cloudnetpy/categorize/atmos_utils.py,sha256=ns5ydiEN34Ng6mJiOBpxKBVDU2NXj6W3Q5IUynmNRYI,3586
15
15
  cloudnetpy/categorize/categorize.py,sha256=VcxSs22icYDG3R5x9jTX7uuSjPU8tyc5bIz0Zj5F9z0,18303
16
16
  cloudnetpy/categorize/classify.py,sha256=a-0bVCtynGfORnDGTsPuzqkuDeOOR_OMz5ai9NsMuic,9870
17
17
  cloudnetpy/categorize/containers.py,sha256=g3SQHoqlY1uJ8b-MG-BbW3oWz5IyacA8kJBeIPy_4EA,4859
@@ -34,7 +34,7 @@ cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoG
34
34
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=RG5HJxGM6p0F-IGyr85fvOizcMmgx48OeD_XeIsrgSU,3367
35
35
  cloudnetpy/instruments/copernicus.py,sha256=nmgqGOjVQFngj7BNbpcuCwA-W3yksvBbqn__iq7MyDk,6469
36
36
  cloudnetpy/instruments/galileo.py,sha256=yQBedd7dmDnwuWi1MtXOsg4-RyRx0uRAXumCY4YuH9k,4686
37
- cloudnetpy/instruments/hatpro.py,sha256=2lEblvJ9m7QniWH1OH7ycWtywYqY6X3ulE4dNuQp-Z8,8749
37
+ cloudnetpy/instruments/hatpro.py,sha256=DzCWzTJxTc5BSOgoeyM8RjYkSXX6NDi3QXgKRp0uxlI,8759
38
38
  cloudnetpy/instruments/instruments.py,sha256=jG5TYnZ8bdCZXnI303ZsaJBEdSKaIjKMbkGtnq6kQX0,3261
39
39
  cloudnetpy/instruments/lufft.py,sha256=ugXF6pssHAAz1Y_hqPdpKuluAjxxHSR88xBmQuS6RlI,3705
40
40
  cloudnetpy/instruments/mira.py,sha256=EyzEBTpWfDlgaspZVuIfaP4l73GYSVnSzEzBZc0lZNg,9333
@@ -43,11 +43,11 @@ cloudnetpy/instruments/nc_lidar.py,sha256=5gQG9PApnNPrHmS9_zanl8HEYIQuGRpbnzC3wf
43
43
  cloudnetpy/instruments/nc_radar.py,sha256=7bKwIZZHM-RagW9AEdgldweaulfy9n61N3RH5fopTqo,6936
44
44
  cloudnetpy/instruments/pollyxt.py,sha256=YuVEHr-BX31rtVOFsWGU-SQFAmcxpXL26eyCVMz_9hw,8933
45
45
  cloudnetpy/instruments/radiometrics.py,sha256=ECN_bSfcV8Evdgfho9-Dl8RThXkAhHzIEj4DPOawSTc,7626
46
- cloudnetpy/instruments/rpg.py,sha256=siPmiyOGdB_OtlnIiP0PAt_cySnped0clLLGnyzw02o,17317
47
- cloudnetpy/instruments/rpg_reader.py,sha256=2eYu-tBd0QyreUKqJT726aIMbA29aIxXK-UJCkOXMLM,11356
46
+ cloudnetpy/instruments/rpg.py,sha256=IozvBJ8_qXTPqtp58FQwRsoI5_aI3-kycpXugZkS0d4,17462
47
+ cloudnetpy/instruments/rpg_reader.py,sha256=ThztFuVrWxhmWVAfZTfQDeUiKK1XMTbtv08IBe8GK98,11364
48
48
  cloudnetpy/instruments/toa5.py,sha256=CfmmBMv5iMGaWHIGBK01Rw24cuXC1R1RMNTXkmsm340,1760
49
49
  cloudnetpy/instruments/vaisala.py,sha256=GGuA_v4S7kR9yApSr1-d0ETzNj4ehEZ7-pD1-AdPYRE,14662
50
- cloudnetpy/instruments/weather_station.py,sha256=F5G_hbmkS4WgORS5oRVLxvKHuYBuef4MC_cZDu4lu_Y,17499
50
+ cloudnetpy/instruments/weather_station.py,sha256=IJw3qdyXkJf10LOfxcpFqGNRN5ThgYfR8l764FVc9l4,17503
51
51
  cloudnetpy/instruments/disdrometer/__init__.py,sha256=lyjwttWvFvuwYxEkusoAvgRcbBmglmOp5HJOpXUqLWo,93
52
52
  cloudnetpy/instruments/disdrometer/common.py,sha256=g52iK2aNp3Z88kovUmGVpC54NZomPa9D871gzO0AmQ4,9267
53
53
  cloudnetpy/instruments/disdrometer/parsivel.py,sha256=HJZrEysQkx9MiIVPDV25CYHpXi_SjgZlgO-otoaKK34,25640
@@ -94,7 +94,7 @@ cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py,sha256=Ra3r4V
94
94
  cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3AZTOAlrgLAy_xFZ8fHYVX0xI,3817
95
95
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
96
96
  cloudnetpy/plotting/plot_meta.py,sha256=JHrr-4A9fhqdi_tQFe6mR4Fdry3hkI-lmmVu5Ny2vco,15979
97
- cloudnetpy/plotting/plotting.py,sha256=rVaCsXTrhb0ahdXerSPLZWRASs_QktyLUbjyHoVuam8,33584
97
+ cloudnetpy/plotting/plotting.py,sha256=6Bnex4V1DI1G_8QscPzVQyukSposA89sP-FQtBEbLHQ,34059
98
98
  cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
99
99
  cloudnetpy/products/classification.py,sha256=bNG8W1CMgGoUBpXopQjYAW3F-uEJGyojXb4A5jmErHo,7921
100
100
  cloudnetpy/products/der.py,sha256=1LDBbnbUg8feMUTGWJq3bObBhEcZ_Ee17MB1x0GwRdo,12669
@@ -108,8 +108,8 @@ cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe5
108
108
  cloudnetpy/products/mwr_tools.py,sha256=tN_sPDS3BdpFJfa5a2mnc3eCMoi7syjVJMaTt962hmo,5004
109
109
  cloudnetpy/products/product_tools.py,sha256=VNw2diJj30POz68-3qNVkJP7r9AUspT_d1Fp0BbeIx8,10414
110
110
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
111
- cloudnetpy-1.65.3.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
- cloudnetpy-1.65.3.dist-info/METADATA,sha256=FTAu9ootkMIzGcQRQLQoTY4hfpScx1srDx_5ZKbGypM,5784
113
- cloudnetpy-1.65.3.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
114
- cloudnetpy-1.65.3.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
- cloudnetpy-1.65.3.dist-info/RECORD,,
111
+ cloudnetpy-1.65.5.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
+ cloudnetpy-1.65.5.dist-info/METADATA,sha256=CiSZoaISK9HEGkWWu0VRiYSjJ8E4YX3UUEQYXmLLqdg,5784
113
+ cloudnetpy-1.65.5.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
114
+ cloudnetpy-1.65.5.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
+ cloudnetpy-1.65.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (73.0.1)
2
+ Generator: setuptools (74.1.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5