cloudnetpy 1.61.17__py3-none-any.whl → 1.62.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.
@@ -10,6 +10,7 @@ import cloudnetpy.categorize.atmos
10
10
  from cloudnetpy import utils
11
11
  from cloudnetpy.categorize import droplet, falling, freezing, insects, melting
12
12
  from cloudnetpy.categorize.containers import ClassData, ClassificationResult
13
+ from cloudnetpy.constants import T0
13
14
 
14
15
 
15
16
  def classify_measurements(data: dict) -> ClassificationResult:
@@ -36,6 +37,14 @@ def classify_measurements(data: dict) -> ClassificationResult:
36
37
  implementation compared to the original Cloudnet methodology.
37
38
  Especially methods classifying insects, melting layer and liquid droplets.
38
39
 
40
+ Explanation of bits:
41
+ - bit 0: Liquid droplets
42
+ - bit 1: Falling hydrometeors
43
+ - bit 2: Freezing region
44
+ - bit 3: Melting layer
45
+ - bit 4: Aerosols
46
+ - bit 5: Insects
47
+
39
48
  """
40
49
  obs = ClassData(data)
41
50
  bits: list[np.ndarray] = [np.array([])] * 6
@@ -73,6 +82,8 @@ def classify_measurements(data: dict) -> ClassificationResult:
73
82
  bits = _filter_insects(bits)
74
83
  bits[4] = _find_aerosols(obs, bits[1], bits[0])
75
84
  bits[4][filtered_ice] = False
85
+ bits = _fix_super_cold_liquid(obs, bits)
86
+
76
87
  return ClassificationResult(
77
88
  category_bits=_bits_to_integer(bits),
78
89
  is_rain=obs.is_rain,
@@ -82,6 +93,15 @@ def classify_measurements(data: dict) -> ClassificationResult:
82
93
  )
83
94
 
84
95
 
96
+ def _fix_super_cold_liquid(obs: ClassData, bits: list) -> list:
97
+ """Supercooled liquid droplets do not exist in atmosphere below around -38 C."""
98
+ t_limit = T0 - 38
99
+ super_cold_liquid = np.where((obs.tw < t_limit) & bits[0])
100
+ bits[0][super_cold_liquid] = False
101
+ bits[1][super_cold_liquid] = True
102
+ return bits
103
+
104
+
85
105
  def _remove_false_radar_liquid(
86
106
  liquid_from_radar: np.ndarray,
87
107
  liquid_from_lidar: np.ndarray,
@@ -87,12 +87,15 @@ def ceilo2nc(
87
87
  if ceilo_obj.instrument is None or ceilo_obj.instrument.model is None:
88
88
  msg = "Failed to read ceilometer model"
89
89
  raise RuntimeError(msg)
90
- if "cl61" in ceilo_obj.instrument.model.lower():
91
- # This kind of screening could be used with other ceilometers as well:
90
+ if any(
91
+ model in ceilo_obj.instrument.model.lower()
92
+ for model in ("cl61", "chm15k", "chm15kx", "cl51", "cl31")
93
+ ):
92
94
  mask = ceilo_obj.data["beta_smooth"].mask
93
95
  ceilo_obj.data["beta"] = ma.masked_where(mask, ceilo_obj.data["beta_raw"])
94
96
  ceilo_obj.data["beta"][ceilo_obj.data["beta"] <= 0] = ma.masked
95
- ceilo_obj.data["depolarisation"].mask = ceilo_obj.data["beta"].mask
97
+ if "depolarisation" in ceilo_obj.data:
98
+ ceilo_obj.data["depolarisation"].mask = ceilo_obj.data["beta"].mask
96
99
  ceilo_obj.screen_depol()
97
100
  ceilo_obj.screen_invalid_values()
98
101
  ceilo_obj.prepare_data()
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 61
3
- PATCH = 17
2
+ MINOR = 62
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.61.17
3
+ Version: 1.62.0
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -8,12 +8,12 @@ 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=sG8SRbHJPdakaVUw4g_7bMgKh3Jib6mBrnrhZvVBWZM,73
11
+ cloudnetpy/version.py,sha256=zim9VT3-QVKAuQTn9k3jQwSlP2Slu9g5kvrN_-965A8,72
12
12
  cloudnetpy/categorize/__init__.py,sha256=gP5q3Vis1y9u9OWgA_idlbjfWXYN_S0IBSWdwBhL_uU,69
13
13
  cloudnetpy/categorize/atmos.py,sha256=G4DmEJCt1FAPYyt7oXzBH47JTeb5lUOGDakkviOXblE,12390
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=64uenj2uxj3P3Blaq_pBN1pBjcF-X4LYNt-uTOjvevg,3778
15
15
  cloudnetpy/categorize/categorize.py,sha256=aoIxbBEwUFO-Xx_oofKM68aL0KEJuGi3OaWMKCCuUK8,17827
16
- cloudnetpy/categorize/classify.py,sha256=l8XoO42GJysio5ODX6qoxWHD9RqtMyz_-T8ZOpOkMxU,9219
16
+ cloudnetpy/categorize/classify.py,sha256=a-0bVCtynGfORnDGTsPuzqkuDeOOR_OMz5ai9NsMuic,9870
17
17
  cloudnetpy/categorize/containers.py,sha256=aL_55tTDYjICS_TnG1u0FwBeXDS0S4mfDMU0kY_DUbs,4312
18
18
  cloudnetpy/categorize/disdrometer.py,sha256=keU3pFvKtk840A0oLwAyNDuqOCswBPJEKf2bV0YWyA8,2004
19
19
  cloudnetpy/categorize/droplet.py,sha256=894VHdL9ScaB8f1oxXwM2la4ShXd-uWywQDINoaoiD8,8687
@@ -28,7 +28,7 @@ cloudnetpy/categorize/radar.py,sha256=C4R74E_jmLOJqXLrfhdrAitHRHHA79UYuChz9VLxy5
28
28
  cloudnetpy/instruments/__init__.py,sha256=_jejVwi_viSZehmAOkEqTNI-0-exGgAJ_bHW1IRRwTI,398
29
29
  cloudnetpy/instruments/basta.py,sha256=_OTnySd36ktvxk_swWBzbv_H4AVGlkF_Ce3KtPGD1rE,3758
30
30
  cloudnetpy/instruments/campbell_scientific.py,sha256=2WHfBKQjtRSl0AqvtPeX7G8Hdi3Dn0WbvoAppFOMbA8,5270
31
- cloudnetpy/instruments/ceilo.py,sha256=-QZNgdTiFmz0G57CU_gZ1cQtYzppgkFJqjndfleefH0,8924
31
+ cloudnetpy/instruments/ceilo.py,sha256=vmKRY-NLB042BLpmJn4sfufEwK5xAI2vOXLRr7K85bU,8981
32
32
  cloudnetpy/instruments/ceilometer.py,sha256=-aPEZs_r0Gxeu53PHeWAkZMB2BUdauS47tkL7RFxo6k,12078
33
33
  cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoGGA,1990
34
34
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=RG5HJxGM6p0F-IGyr85fvOizcMmgx48OeD_XeIsrgSU,3367
@@ -108,8 +108,8 @@ cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe5
108
108
  cloudnetpy/products/mwr_tools.py,sha256=3esU5cG5GI2WVmOENqrJ0FbMuxLegADv7q8TB0RorGg,4674
109
109
  cloudnetpy/products/product_tools.py,sha256=VNw2diJj30POz68-3qNVkJP7r9AUspT_d1Fp0BbeIx8,10414
110
110
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
111
- cloudnetpy-1.61.17.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
- cloudnetpy-1.61.17.dist-info/METADATA,sha256=2AH_VXXd8wljsFeHDdnGWqPrOqt8gcKDSBRo82PrTYo,5785
113
- cloudnetpy-1.61.17.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
114
- cloudnetpy-1.61.17.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
- cloudnetpy-1.61.17.dist-info/RECORD,,
111
+ cloudnetpy-1.62.0.dist-info/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
112
+ cloudnetpy-1.62.0.dist-info/METADATA,sha256=BIWI6z_98OC0XNiVwVJKjB2IZ_6za4MCkAN0eLeafyE,5784
113
+ cloudnetpy-1.62.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
114
+ cloudnetpy-1.62.0.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
115
+ cloudnetpy-1.62.0.dist-info/RECORD,,