disdrodb 0.0.20__py3-none-any.whl → 0.1.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.
Files changed (264) hide show
  1. disdrodb/__init__.py +132 -15
  2. disdrodb/_config.py +4 -2
  3. disdrodb/_version.py +9 -4
  4. disdrodb/api/checks.py +264 -237
  5. disdrodb/api/configs.py +4 -8
  6. disdrodb/api/create_directories.py +235 -290
  7. disdrodb/api/info.py +217 -26
  8. disdrodb/api/io.py +295 -269
  9. disdrodb/api/path.py +597 -173
  10. disdrodb/api/search.py +486 -0
  11. disdrodb/{metadata/scripts → cli}/disdrodb_check_metadata_archive.py +12 -7
  12. disdrodb/{utils/pandas.py → cli/disdrodb_data_archive_directory.py} +9 -18
  13. disdrodb/cli/disdrodb_download_archive.py +86 -0
  14. disdrodb/cli/disdrodb_download_metadata_archive.py +53 -0
  15. disdrodb/cli/disdrodb_download_station.py +84 -0
  16. disdrodb/{api/scripts → cli}/disdrodb_initialize_station.py +22 -10
  17. disdrodb/cli/disdrodb_metadata_archive_directory.py +32 -0
  18. disdrodb/{data_transfer/scripts/disdrodb_download_station.py → cli/disdrodb_open_data_archive.py} +22 -22
  19. disdrodb/cli/disdrodb_open_logs_directory.py +69 -0
  20. disdrodb/{data_transfer/scripts/disdrodb_upload_station.py → cli/disdrodb_open_metadata_archive.py} +22 -24
  21. disdrodb/cli/disdrodb_open_metadata_directory.py +71 -0
  22. disdrodb/cli/disdrodb_open_product_directory.py +74 -0
  23. disdrodb/cli/disdrodb_open_readers_directory.py +32 -0
  24. disdrodb/{l0/scripts → cli}/disdrodb_run_l0.py +38 -31
  25. disdrodb/{l0/scripts → cli}/disdrodb_run_l0_station.py +32 -30
  26. disdrodb/{l0/scripts → cli}/disdrodb_run_l0a.py +30 -21
  27. disdrodb/{l0/scripts → cli}/disdrodb_run_l0a_station.py +24 -33
  28. disdrodb/{l0/scripts → cli}/disdrodb_run_l0b.py +30 -21
  29. disdrodb/{l0/scripts → cli}/disdrodb_run_l0b_station.py +25 -34
  30. disdrodb/cli/disdrodb_run_l0c.py +130 -0
  31. disdrodb/cli/disdrodb_run_l0c_station.py +129 -0
  32. disdrodb/cli/disdrodb_run_l1.py +122 -0
  33. disdrodb/cli/disdrodb_run_l1_station.py +121 -0
  34. disdrodb/cli/disdrodb_run_l2e.py +122 -0
  35. disdrodb/cli/disdrodb_run_l2e_station.py +122 -0
  36. disdrodb/cli/disdrodb_run_l2m.py +122 -0
  37. disdrodb/cli/disdrodb_run_l2m_station.py +122 -0
  38. disdrodb/cli/disdrodb_upload_archive.py +105 -0
  39. disdrodb/cli/disdrodb_upload_station.py +98 -0
  40. disdrodb/configs.py +90 -25
  41. disdrodb/data_transfer/__init__.py +22 -0
  42. disdrodb/data_transfer/download_data.py +87 -90
  43. disdrodb/data_transfer/upload_data.py +64 -37
  44. disdrodb/data_transfer/zenodo.py +15 -18
  45. disdrodb/docs.py +1 -1
  46. disdrodb/issue/__init__.py +17 -4
  47. disdrodb/issue/checks.py +10 -23
  48. disdrodb/issue/reader.py +9 -12
  49. disdrodb/issue/writer.py +14 -17
  50. disdrodb/l0/__init__.py +17 -26
  51. disdrodb/l0/check_configs.py +35 -23
  52. disdrodb/l0/check_standards.py +32 -42
  53. disdrodb/l0/configs/{Thies_LPM → LPM}/bins_diameter.yml +44 -44
  54. disdrodb/l0/configs/{Thies_LPM → LPM}/bins_velocity.yml +40 -40
  55. disdrodb/l0/configs/LPM/l0a_encodings.yml +80 -0
  56. disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_cf_attrs.yml +62 -59
  57. disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_encodings.yml +9 -9
  58. disdrodb/l0/configs/{Thies_LPM → LPM}/raw_data_format.yml +245 -245
  59. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/bins_diameter.yml +66 -66
  60. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/bins_velocity.yml +64 -64
  61. disdrodb/l0/configs/PARSIVEL/l0a_encodings.yml +32 -0
  62. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/l0b_cf_attrs.yml +22 -20
  63. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/l0b_encodings.yml +17 -17
  64. disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/raw_data_format.yml +77 -77
  65. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/bins_diameter.yml +64 -64
  66. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/bins_velocity.yml +64 -64
  67. disdrodb/l0/configs/PARSIVEL2/l0a_encodings.yml +39 -0
  68. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_cf_attrs.yml +24 -22
  69. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_encodings.yml +20 -20
  70. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/raw_data_format.yml +98 -98
  71. disdrodb/l0/configs/{RD_80 → RD80}/bins_diameter.yml +40 -40
  72. disdrodb/l0/configs/RD80/l0a_encodings.yml +16 -0
  73. disdrodb/l0/configs/{RD_80 → RD80}/l0b_cf_attrs.yml +3 -3
  74. disdrodb/l0/configs/RD80/l0b_encodings.yml +135 -0
  75. disdrodb/l0/configs/{RD_80 → RD80}/raw_data_format.yml +48 -48
  76. disdrodb/l0/l0_reader.py +216 -340
  77. disdrodb/l0/l0a_processing.py +237 -208
  78. disdrodb/l0/l0b_nc_processing.py +227 -80
  79. disdrodb/l0/l0b_processing.py +93 -173
  80. disdrodb/l0/l0c_processing.py +627 -0
  81. disdrodb/l0/readers/{ARM → LPM/ARM}/ARM_LPM.py +36 -58
  82. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +226 -0
  83. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +185 -0
  84. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +183 -0
  85. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +179 -0
  86. disdrodb/l0/readers/{UK → LPM/UK}/DIVEN.py +14 -35
  87. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +157 -0
  88. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +113 -0
  89. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/ARCTIC_2021.py +40 -57
  90. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/COMMON_2011.py +37 -54
  91. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/DAVOS_2009_2011.py +34 -51
  92. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_2009.py +34 -51
  93. disdrodb/l0/readers/{EPFL/PARADISO_2014.py → PARSIVEL/EPFL/EPFL_ROOF_2008.py} +38 -50
  94. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +105 -0
  95. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2011.py +34 -51
  96. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2012.py +33 -51
  97. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GENEPI_2007.py +25 -44
  98. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007.py +25 -44
  99. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007_2.py +25 -44
  100. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HPICONET_2010.py +34 -51
  101. disdrodb/l0/readers/{EPFL/EPFL_ROOF_2010.py → PARSIVEL/EPFL/HYMEX_LTE_SOP2.py} +37 -50
  102. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +111 -0
  103. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HYMEX_LTE_SOP4.py +36 -54
  104. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2018.py +34 -52
  105. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2019.py +38 -56
  106. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +105 -0
  107. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PARSIVEL_2007.py +27 -45
  108. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PLATO_2019.py +24 -44
  109. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +140 -0
  110. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RACLETS_2019_WJF.py +41 -59
  111. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RIETHOLZBACH_2011.py +34 -51
  112. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +117 -0
  113. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +137 -0
  114. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/UNIL_2022.py +42 -55
  115. disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +104 -0
  116. disdrodb/l0/readers/{GPM → PARSIVEL/GPM}/LPVEX.py +29 -48
  117. disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +184 -0
  118. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +113 -0
  119. disdrodb/l0/readers/{NCAR/VORTEX_SE_2016_P1.py → PARSIVEL/NCAR/OWLES_MIPS.py} +46 -72
  120. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +125 -0
  121. disdrodb/l0/readers/{NCAR/OWLES_MIPS.py → PARSIVEL/NCAR/PLOWS_MIPS.py} +45 -64
  122. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +114 -0
  123. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +176 -0
  124. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +183 -0
  125. disdrodb/l0/readers/{ARM/ARM_LD.py → PARSIVEL2/ARM/ARM_PARSIVEL2.py} +27 -50
  126. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +163 -0
  127. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +163 -0
  128. disdrodb/l0/readers/{DENMARK → PARSIVEL2/DENMARK}/EROSION_nc.py +14 -35
  129. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +119 -0
  130. disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +104 -0
  131. disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +176 -0
  132. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +32 -0
  133. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +56 -0
  134. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +120 -0
  135. disdrodb/l0/readers/{NCAR → PARSIVEL2/NCAR}/PECAN_MIPS.py +45 -64
  136. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +181 -0
  137. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +160 -0
  138. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +160 -0
  139. disdrodb/l0/readers/{NCAR/PLOWS_MIPS.py → PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py} +49 -66
  140. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +118 -0
  141. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +152 -0
  142. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT.py +166 -0
  143. disdrodb/l0/readers/{NCAR/RELAMPAGO_RD80.py → RD80/BRAZIL/CHUVA_RD80.py} +36 -60
  144. disdrodb/l0/readers/{BRAZIL → RD80/BRAZIL}/GOAMAZON_RD80.py +36 -55
  145. disdrodb/l0/readers/{NCAR → RD80/NCAR}/CINDY_2011_RD80.py +35 -54
  146. disdrodb/l0/readers/{BRAZIL/CHUVA_RD80.py → RD80/NCAR/RELAMPAGO_RD80.py} +40 -54
  147. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +62 -0
  148. disdrodb/l0/readers/{reader_template.py → template_reader_raw_text_data.py} +20 -44
  149. disdrodb/l0/routines.py +885 -581
  150. disdrodb/l0/standards.py +72 -236
  151. disdrodb/l0/template_tools.py +104 -109
  152. disdrodb/l1/__init__.py +17 -0
  153. disdrodb/l1/beard_model.py +716 -0
  154. disdrodb/l1/encoding_attrs.py +620 -0
  155. disdrodb/l1/fall_velocity.py +260 -0
  156. disdrodb/l1/filters.py +192 -0
  157. disdrodb/l1/processing.py +200 -0
  158. disdrodb/l1/resampling.py +236 -0
  159. disdrodb/l1/routines.py +357 -0
  160. disdrodb/l1_env/__init__.py +17 -0
  161. disdrodb/l1_env/routines.py +38 -0
  162. disdrodb/l2/__init__.py +17 -0
  163. disdrodb/l2/empirical_dsd.py +1735 -0
  164. disdrodb/l2/event.py +388 -0
  165. disdrodb/l2/processing.py +519 -0
  166. disdrodb/l2/processing_options.py +213 -0
  167. disdrodb/l2/routines.py +868 -0
  168. disdrodb/metadata/__init__.py +9 -2
  169. disdrodb/metadata/checks.py +165 -118
  170. disdrodb/metadata/download.py +81 -0
  171. disdrodb/metadata/geolocation.py +146 -0
  172. disdrodb/metadata/info.py +20 -13
  173. disdrodb/metadata/manipulation.py +1 -1
  174. disdrodb/metadata/reader.py +59 -8
  175. disdrodb/metadata/search.py +77 -144
  176. disdrodb/metadata/standards.py +7 -8
  177. disdrodb/metadata/writer.py +8 -14
  178. disdrodb/psd/__init__.py +38 -0
  179. disdrodb/psd/fitting.py +2146 -0
  180. disdrodb/psd/models.py +774 -0
  181. disdrodb/routines.py +1176 -0
  182. disdrodb/scattering/__init__.py +28 -0
  183. disdrodb/scattering/axis_ratio.py +344 -0
  184. disdrodb/scattering/routines.py +456 -0
  185. disdrodb/utils/__init__.py +17 -0
  186. disdrodb/utils/attrs.py +208 -0
  187. disdrodb/utils/cli.py +269 -0
  188. disdrodb/utils/compression.py +60 -42
  189. disdrodb/utils/dask.py +62 -0
  190. disdrodb/utils/decorators.py +110 -0
  191. disdrodb/utils/directories.py +107 -46
  192. disdrodb/utils/encoding.py +127 -0
  193. disdrodb/utils/list.py +29 -0
  194. disdrodb/utils/logger.py +168 -46
  195. disdrodb/utils/time.py +657 -0
  196. disdrodb/utils/warnings.py +30 -0
  197. disdrodb/utils/writer.py +57 -0
  198. disdrodb/utils/xarray.py +138 -47
  199. disdrodb/utils/yaml.py +0 -1
  200. disdrodb/viz/__init__.py +17 -0
  201. disdrodb/viz/plots.py +17 -0
  202. disdrodb-0.1.0.dist-info/METADATA +321 -0
  203. disdrodb-0.1.0.dist-info/RECORD +216 -0
  204. {disdrodb-0.0.20.dist-info → disdrodb-0.1.0.dist-info}/WHEEL +1 -1
  205. disdrodb-0.1.0.dist-info/entry_points.txt +30 -0
  206. disdrodb/data_transfer/scripts/disdrodb_download_archive.py +0 -53
  207. disdrodb/data_transfer/scripts/disdrodb_upload_archive.py +0 -57
  208. disdrodb/l0/configs/OTT_Parsivel/l0a_encodings.yml +0 -32
  209. disdrodb/l0/configs/OTT_Parsivel2/l0a_encodings.yml +0 -39
  210. disdrodb/l0/configs/RD_80/l0a_encodings.yml +0 -16
  211. disdrodb/l0/configs/RD_80/l0b_encodings.yml +0 -135
  212. disdrodb/l0/configs/Thies_LPM/l0a_encodings.yml +0 -80
  213. disdrodb/l0/io.py +0 -257
  214. disdrodb/l0/l0_processing.py +0 -1091
  215. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_OTT.py +0 -178
  216. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_THIES.py +0 -247
  217. disdrodb/l0/readers/BRAZIL/CHUVA_LPM.py +0 -204
  218. disdrodb/l0/readers/BRAZIL/CHUVA_OTT.py +0 -183
  219. disdrodb/l0/readers/BRAZIL/GOAMAZON_LPM.py +0 -204
  220. disdrodb/l0/readers/BRAZIL/GOAMAZON_OTT.py +0 -183
  221. disdrodb/l0/readers/CHINA/CHONGQING.py +0 -131
  222. disdrodb/l0/readers/EPFL/EPFL_ROOF_2008.py +0 -128
  223. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP2.py +0 -127
  224. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP3.py +0 -129
  225. disdrodb/l0/readers/EPFL/RACLETS_2019.py +0 -158
  226. disdrodb/l0/readers/EPFL/SAMOYLOV_2017.py +0 -136
  227. disdrodb/l0/readers/EPFL/SAMOYLOV_2019.py +0 -158
  228. disdrodb/l0/readers/FRANCE/SIRTA_OTT2.py +0 -138
  229. disdrodb/l0/readers/GPM/GCPEX.py +0 -123
  230. disdrodb/l0/readers/GPM/IFLOODS.py +0 -123
  231. disdrodb/l0/readers/GPM/MC3E.py +0 -123
  232. disdrodb/l0/readers/GPM/NSSTC.py +0 -164
  233. disdrodb/l0/readers/ITALY/GID.py +0 -199
  234. disdrodb/l0/readers/MEXICO/OH_IIUNAM_nc.py +0 -92
  235. disdrodb/l0/readers/NCAR/CCOPE_2015.py +0 -133
  236. disdrodb/l0/readers/NCAR/PECAN_FP3.py +0 -137
  237. disdrodb/l0/readers/NCAR/PECAN_MOBILE.py +0 -144
  238. disdrodb/l0/readers/NCAR/RELAMPAGO_OTT.py +0 -195
  239. disdrodb/l0/readers/NCAR/SNOWIE_PJ.py +0 -172
  240. disdrodb/l0/readers/NCAR/SNOWIE_SB.py +0 -179
  241. disdrodb/l0/readers/NCAR/VORTEX2_2009.py +0 -133
  242. disdrodb/l0/readers/NCAR/VORTEX2_2010.py +0 -188
  243. disdrodb/l0/readers/NCAR/VORTEX2_2010_UF.py +0 -191
  244. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_P2.py +0 -135
  245. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_PIPS.py +0 -170
  246. disdrodb/l0/readers/NETHERLANDS/DELFT.py +0 -187
  247. disdrodb/l0/readers/SPAIN/SBEGUERIA.py +0 -179
  248. disdrodb/l0/scripts/disdrodb_run_l0b_concat.py +0 -93
  249. disdrodb/l0/scripts/disdrodb_run_l0b_concat_station.py +0 -85
  250. disdrodb/utils/netcdf.py +0 -452
  251. disdrodb/utils/scripts.py +0 -102
  252. disdrodb-0.0.20.dist-info/AUTHORS.md +0 -18
  253. disdrodb-0.0.20.dist-info/METADATA +0 -186
  254. disdrodb-0.0.20.dist-info/RECORD +0 -168
  255. disdrodb-0.0.20.dist-info/entry_points.txt +0 -15
  256. /disdrodb/l0/configs/{RD_80 → RD80}/bins_velocity.yml +0 -0
  257. /disdrodb/l0/manuals/{Thies_LPM.pdf → LPM.pdf} +0 -0
  258. /disdrodb/l0/manuals/{ODM_470.pdf → ODM470.pdf} +0 -0
  259. /disdrodb/l0/manuals/{OTT_Parsivel.pdf → PARSIVEL.pdf} +0 -0
  260. /disdrodb/l0/manuals/{OTT_Parsivel2.pdf → PARSIVEL2.pdf} +0 -0
  261. /disdrodb/l0/manuals/{PWS_100.pdf → PWS100.pdf} +0 -0
  262. /disdrodb/l0/manuals/{RD_80.pdf → RD80.pdf} +0 -0
  263. {disdrodb-0.0.20.dist-info → disdrodb-0.1.0.dist-info/licenses}/LICENSE +0 -0
  264. {disdrodb-0.0.20.dist-info → disdrodb-0.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,183 @@
1
+ #!/usr/bin/env python3
2
+ # -----------------------------------------------------------------------------.
3
+ # Copyright (c) 2021-2023 DISDRODB developers
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ # -----------------------------------------------------------------------------.
18
+ import pandas as pd
19
+
20
+ from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
21
+ from disdrodb.l0.l0a_processing import read_raw_text_file
22
+
23
+
24
+ @is_documented_by(reader_generic_docstring)
25
+ def reader(
26
+ filepath,
27
+ logger=None,
28
+ ):
29
+ """Reader."""
30
+ ##------------------------------------------------------------------------.
31
+ #### Define column names
32
+ column_names = ["TO_BE_PARSED"]
33
+
34
+ ##------------------------------------------------------------------------.
35
+ #### Define reader options
36
+ reader_kwargs = {}
37
+ # - Define delimiter
38
+ reader_kwargs["delimiter"] = "\\n"
39
+ # - Skip first row as columns names
40
+ # - Define encoding
41
+ reader_kwargs["encoding"] = "latin" # "ISO-8859-1"
42
+ # - Avoid first column to become df index !!!
43
+ reader_kwargs["index_col"] = False
44
+ # - Define behaviour when encountering bad lines
45
+ reader_kwargs["on_bad_lines"] = "skip"
46
+ # - Define reader engine
47
+ # - C engine is faster
48
+ # - Python engine is more feature-complete
49
+ reader_kwargs["engine"] = "python"
50
+ # - Define on-the-fly decompression of on-disk data
51
+ # - Available: gzip, bz2, zip
52
+ reader_kwargs["compression"] = "infer"
53
+ # - Strings to recognize as NA/NaN and replace with standard NA flags
54
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
55
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
56
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
57
+ reader_kwargs["na_values"] = ["na", "", "error"]
58
+
59
+ ##------------------------------------------------------------------------.
60
+ #### Read the data
61
+ df = read_raw_text_file(
62
+ filepath=filepath,
63
+ column_names=column_names,
64
+ reader_kwargs=reader_kwargs,
65
+ logger=logger,
66
+ )
67
+
68
+ ##------------------------------------------------------------------------.
69
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
70
+ # Count number of delimiters to identify valid rows
71
+ df = df[df["TO_BE_PARSED"].str.count(";") == 520]
72
+
73
+ # Split by ; delimiter
74
+ df = df["TO_BE_PARSED"].str.split(";", expand=True, n=79)
75
+
76
+ # Assign column names
77
+ column_names = [
78
+ "start_identifier",
79
+ "device_address",
80
+ "sensor_serial_number",
81
+ "sensor_date",
82
+ "sensor_time",
83
+ "weather_code_synop_4677_5min",
84
+ "weather_code_synop_4680_5min",
85
+ "weather_code_metar_4678_5min",
86
+ "precipitation_rate_5min",
87
+ "weather_code_synop_4677",
88
+ "weather_code_synop_4680",
89
+ "weather_code_metar_4678",
90
+ "precipitation_rate",
91
+ "rainfall_rate",
92
+ "snowfall_rate",
93
+ "precipitation_accumulated",
94
+ "mor_visibility",
95
+ "reflectivity",
96
+ "quality_index",
97
+ "max_hail_diameter",
98
+ "laser_status",
99
+ "static_signal",
100
+ "laser_temperature_analog_status",
101
+ "laser_temperature_digital_status",
102
+ "laser_current_analog_status",
103
+ "laser_current_digital_status",
104
+ "sensor_voltage_supply_status",
105
+ "current_heating_pane_transmitter_head_status",
106
+ "current_heating_pane_receiver_head_status",
107
+ "temperature_sensor_status",
108
+ "current_heating_voltage_supply_status",
109
+ "current_heating_house_status",
110
+ "current_heating_heads_status",
111
+ "current_heating_carriers_status",
112
+ "control_output_laser_power_status",
113
+ "reserve_status",
114
+ "temperature_interior",
115
+ "laser_temperature",
116
+ "laser_current_average",
117
+ "control_voltage",
118
+ "optical_control_voltage_output",
119
+ "sensor_voltage_supply",
120
+ "current_heating_pane_transmitter_head",
121
+ "current_heating_pane_receiver_head",
122
+ "temperature_ambient",
123
+ "current_heating_voltage_supply",
124
+ "current_heating_house",
125
+ "current_heating_heads",
126
+ "current_heating_carriers",
127
+ "number_particles",
128
+ "number_particles_internal_data",
129
+ "number_particles_min_speed",
130
+ "number_particles_min_speed_internal_data",
131
+ "number_particles_max_speed",
132
+ "number_particles_max_speed_internal_data",
133
+ "number_particles_min_diameter",
134
+ "number_particles_min_diameter_internal_data",
135
+ "number_particles_no_hydrometeor",
136
+ "number_particles_no_hydrometeor_internal_data",
137
+ "number_particles_unknown_classification",
138
+ "number_particles_unknown_classification_internal_data",
139
+ "number_particles_class_1",
140
+ "number_particles_class_1_internal_data",
141
+ "number_particles_class_2",
142
+ "number_particles_class_2_internal_data",
143
+ "number_particles_class_3",
144
+ "number_particles_class_3_internal_data",
145
+ "number_particles_class_4",
146
+ "number_particles_class_4_internal_data",
147
+ "number_particles_class_5",
148
+ "number_particles_class_5_internal_data",
149
+ "number_particles_class_6",
150
+ "number_particles_class_6_internal_data",
151
+ "number_particles_class_7",
152
+ "number_particles_class_7_internal_data",
153
+ "number_particles_class_8",
154
+ "number_particles_class_8_internal_data",
155
+ "number_particles_class_9",
156
+ "number_particles_class_9_internal_data",
157
+ "raw_drop_number",
158
+ ]
159
+ df.columns = column_names
160
+
161
+ # Define datetime "time" column
162
+ df["time"] = df["sensor_date"] + "-" + df["sensor_time"]
163
+ df["time"] = pd.to_datetime(df["time"], format="%d.%m.%y-%H:%M:%S", errors="coerce")
164
+
165
+ # Drop row if start_identifier different than 00
166
+ df = df[df["start_identifier"].astype(str) == "00"]
167
+
168
+ # Clean raw_drop_number (ignore last "AC" character)
169
+ df["raw_drop_number"] = df["raw_drop_number"].str[:1760]
170
+
171
+ # Drop rows with invalid raw_drop_number
172
+ df = df[df["raw_drop_number"].astype(str).str.len() == 1760]
173
+
174
+ # Drop columns not agreeing with DISDRODB L0 standards
175
+ columns_to_drop = [
176
+ "start_identifier",
177
+ "device_address",
178
+ "sensor_serial_number",
179
+ "sensor_date",
180
+ "sensor_time",
181
+ ]
182
+ df = df.drop(columns=columns_to_drop)
183
+ return df
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env python3
2
+ # -----------------------------------------------------------------------------.
3
+ # Copyright (c) 2021-2023 DISDRODB developers
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ # -----------------------------------------------------------------------------.
18
+ """Reader for the GID LPM network."""
19
+ import pandas as pd
20
+
21
+ from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
22
+ from disdrodb.l0.l0a_processing import read_raw_text_file
23
+
24
+
25
+ @is_documented_by(reader_generic_docstring)
26
+ def reader(
27
+ filepath,
28
+ logger=None,
29
+ ):
30
+ """Reader."""
31
+ ##------------------------------------------------------------------------.
32
+ #### Define column names
33
+ column_names = ["TO_BE_SPLITTED"]
34
+
35
+ ##------------------------------------------------------------------------.
36
+ #### Define reader options
37
+ reader_kwargs = {}
38
+ # - Define delimiter
39
+ reader_kwargs["delimiter"] = "\n"
40
+ # Skip first row as columns names
41
+ reader_kwargs["header"] = None
42
+ # - Avoid first column to become df index
43
+ reader_kwargs["index_col"] = False
44
+ # - Define behaviour when encountering bad lines
45
+ reader_kwargs["on_bad_lines"] = "skip"
46
+ # - Define reader engine
47
+ # - C engine is faster
48
+ # - Python engine is more feature-complete
49
+ reader_kwargs["engine"] = "python"
50
+ # - Define on-the-fly decompression of on-disk data
51
+ # - Available: gzip, bz2, zip
52
+ reader_kwargs["compression"] = "infer"
53
+ # - Strings to recognize as NA/NaN and replace with standard NA flags
54
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
55
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
56
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
57
+ reader_kwargs["na_values"] = ["na", "", "error", "NA", "-.-"]
58
+
59
+ ##------------------------------------------------------------------------.
60
+ #### Read the data
61
+ df = read_raw_text_file(
62
+ filepath=filepath,
63
+ column_names=column_names,
64
+ reader_kwargs=reader_kwargs,
65
+ logger=logger,
66
+ )
67
+
68
+ ##------------------------------------------------------------------------.
69
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
70
+ # Split columns
71
+ df = df["TO_BE_SPLITTED"].str.split(";", n=79, expand=True)
72
+
73
+ # Assign column names
74
+ column_names = [
75
+ "start_identifier",
76
+ "sensor_serial_number",
77
+ "software_version",
78
+ "sensor_date",
79
+ "sensor_time",
80
+ "weather_code_synop_4677_5min",
81
+ "weather_code_synop_4680_5min",
82
+ "weather_code_metar_4678_5min",
83
+ "precipitation_rate_5min",
84
+ "weather_code_synop_4677",
85
+ "weather_code_synop_4680",
86
+ "weather_code_metar_4678",
87
+ "precipitation_rate",
88
+ "rainfall_rate",
89
+ "snowfall_rate",
90
+ "precipitation_accumulated",
91
+ "mor_visibility",
92
+ "reflectivity",
93
+ "quality_index",
94
+ "max_hail_diameter",
95
+ "laser_status",
96
+ "static_signal",
97
+ "laser_temperature_analog_status",
98
+ "laser_temperature_digital_status",
99
+ "laser_current_analog_status",
100
+ "laser_current_digital_status",
101
+ "sensor_voltage_supply_status",
102
+ "current_heating_pane_transmitter_head_status",
103
+ "current_heating_pane_receiver_head_status",
104
+ "temperature_sensor_status",
105
+ "current_heating_voltage_supply_status",
106
+ "current_heating_house_status",
107
+ "current_heating_heads_status",
108
+ "current_heating_carriers_status",
109
+ "control_output_laser_power_status",
110
+ "reserve_status",
111
+ "temperature_interior",
112
+ "laser_temperature",
113
+ "laser_current_average",
114
+ "control_voltage",
115
+ "optical_control_voltage_output",
116
+ "sensor_voltage_supply",
117
+ "current_heating_pane_transmitter_head",
118
+ "current_heating_pane_receiver_head",
119
+ "temperature_ambient",
120
+ "current_heating_voltage_supply",
121
+ "current_heating_house",
122
+ "current_heating_heads",
123
+ "current_heating_carriers",
124
+ "number_particles",
125
+ "number_particles_internal_data",
126
+ "number_particles_min_speed",
127
+ "number_particles_min_speed_internal_data",
128
+ "number_particles_max_speed",
129
+ "number_particles_max_speed_internal_data",
130
+ "number_particles_min_diameter",
131
+ "number_particles_min_diameter_internal_data",
132
+ "number_particles_no_hydrometeor",
133
+ "number_particles_no_hydrometeor_internal_data",
134
+ "number_particles_unknown_classification",
135
+ "number_particles_unknown_classification_internal_data",
136
+ "number_particles_class_1",
137
+ "number_particles_class_1_internal_data",
138
+ "number_particles_class_2",
139
+ "number_particles_class_2_internal_data",
140
+ "number_particles_class_3",
141
+ "number_particles_class_3_internal_data",
142
+ "number_particles_class_4",
143
+ "number_particles_class_4_internal_data",
144
+ "number_particles_class_5",
145
+ "number_particles_class_5_internal_data",
146
+ "number_particles_class_6",
147
+ "number_particles_class_6_internal_data",
148
+ "number_particles_class_7",
149
+ "number_particles_class_7_internal_data",
150
+ "number_particles_class_8",
151
+ "number_particles_class_8_internal_data",
152
+ "number_particles_class_9",
153
+ "number_particles_class_9_internal_data",
154
+ "raw_drop_number",
155
+ ]
156
+ df.columns = column_names
157
+
158
+ # Remove checksum at end of raw_drop_number
159
+ df["raw_drop_number"] = df["raw_drop_number"].str.slice(stop=1760)
160
+
161
+ # Define 'time column
162
+ df["time"] = df["sensor_date"].astype(str) + " " + df["sensor_time"].astype(str)
163
+
164
+ # Convert time column to datetime
165
+ df["time"] = pd.to_datetime(df["time"], format="%d.%m.%y %H:%M:%S", errors="coerce")
166
+
167
+ # Drop columns not agreeing with DISDRODB L0 standards
168
+ columns_to_drop = [
169
+ "start_identifier",
170
+ "software_version",
171
+ "sensor_serial_number",
172
+ "sensor_date",
173
+ "sensor_time",
174
+ ]
175
+ df = df.drop(columns=columns_to_drop)
176
+ df = df.drop(columns=["sensor_date", "sensor_time"])
177
+
178
+ # Return the dataframe adhering to DISDRODB L0 standards
179
+ return df
@@ -15,21 +15,22 @@
15
15
  # You should have received a copy of the GNU General Public License
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  # -----------------------------------------------------------------------------.
18
- from disdrodb.l0 import run_l0b_from_nc
19
18
  from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
19
+ from disdrodb.l0.l0b_nc_processing import open_raw_netcdf_file, standardize_raw_dataset
20
20
 
21
21
 
22
22
  @is_documented_by(reader_generic_docstring)
23
23
  def reader(
24
- raw_dir,
25
- processed_dir,
26
- station_name,
27
- # Processing options
28
- force=False,
29
- verbose=False,
30
- parallel=False,
31
- debugging_mode=False,
24
+ filepath,
25
+ logger=None,
32
26
  ):
27
+ """Reader."""
28
+ ##------------------------------------------------------------------------.
29
+ #### Open the netCDF
30
+ ds = open_raw_netcdf_file(filepath=filepath, logger=logger)
31
+
32
+ ##------------------------------------------------------------------------.
33
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
33
34
  # Define dictionary mapping dataset variables to select and rename
34
35
  dict_names = {
35
36
  ### Dimensions
@@ -61,30 +62,8 @@ def reader(
61
62
  # 'hydrometeor_type_5m' # Pickering et al., 2019
62
63
  }
63
64
 
64
- # Define dataset sanitizer
65
- def ds_sanitizer_fun(ds):
66
- # Return dataset
67
- return ds
68
-
69
- # Define glob pattern to search data files in <raw_dir>/data/<station_name>
70
- glob_patterns = "*.nc*"
71
-
72
- ####----------------------------------------------------------------------.
73
- #### - Create L0A products
74
- run_l0b_from_nc(
75
- raw_dir=raw_dir,
76
- processed_dir=processed_dir,
77
- station_name=station_name,
78
- # Custom arguments of the reader
79
- glob_patterns=glob_patterns,
80
- dict_names=dict_names,
81
- ds_sanitizer_fun=ds_sanitizer_fun,
82
- # Processing options
83
- force=force,
84
- verbose=verbose,
85
- parallel=parallel,
86
- debugging_mode=debugging_mode,
87
- )
88
-
65
+ # Rename dataset variables and columns and infill missing variables
66
+ ds = standardize_raw_dataset(ds=ds, dict_names=dict_names, sensor_name="LPM")
89
67
 
90
- # -----------------------------------------------------------------.
68
+ # Return the dataset adhering to DISDRODB L0B standards
69
+ return ds
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env python3
2
+ # -----------------------------------------------------------------------------.
3
+ # Copyright (c) 2021-2023 DISDRODB developers
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ # -----------------------------------------------------------------------------.
18
+ import numpy as np
19
+ import pandas as pd
20
+
21
+ from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
22
+ from disdrodb.l0.l0a_processing import read_raw_text_file
23
+
24
+
25
+ @is_documented_by(reader_generic_docstring)
26
+ def reader(
27
+ filepath,
28
+ logger=None,
29
+ ):
30
+ """Reader."""
31
+ ##------------------------------------------------------------------------.
32
+ #### Define column names
33
+ column_names = ["TO_BE_PARSED"]
34
+
35
+ ##------------------------------------------------------------------------.
36
+ #### Define reader options
37
+ reader_kwargs = {}
38
+
39
+ # - Define delimiter
40
+ reader_kwargs["delimiter"] = "/\n"
41
+
42
+ # Skip first row as columns names
43
+ reader_kwargs["header"] = None
44
+
45
+ # Skip first 2 rows
46
+ reader_kwargs["skiprows"] = 2
47
+
48
+ # - Avoid first column to become df index !!!
49
+ reader_kwargs["index_col"] = False
50
+
51
+ # - Define behaviour when encountering bad lines
52
+ reader_kwargs["on_bad_lines"] = "skip"
53
+
54
+ # - Define reader engine
55
+ # - C engine is faster
56
+ # - Python engine is more feature-complete
57
+ reader_kwargs["engine"] = "python"
58
+
59
+ # - Define on-the-fly decompression of on-disk data
60
+ # - Available: gzip, bz2, zip
61
+ reader_kwargs["compression"] = "infer"
62
+
63
+ # - Strings to recognize as NA/NaN and replace with standard NA flags
64
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
65
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
66
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
67
+ reader_kwargs["na_values"] = ["na", "", "error", "NA"]
68
+
69
+ ##------------------------------------------------------------------------.
70
+ #### Read the data
71
+ df = read_raw_text_file(
72
+ filepath=filepath,
73
+ column_names=column_names,
74
+ reader_kwargs=reader_kwargs,
75
+ logger=logger,
76
+ )
77
+
78
+ ##------------------------------------------------------------------------.
79
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
80
+ # Remove rows with invalid length
81
+ # - time: 20
82
+ # - data: 4638
83
+ df = df[df["TO_BE_PARSED"].str.len().isin([20, 4638])]
84
+ df = df.reset_index(drop=True)
85
+
86
+ # Remove rows with consecutive timesteps
87
+ # - Keep last timestep occurrence
88
+ idx_timesteps = np.where(df["TO_BE_PARSED"].str.len() == 20)[0]
89
+ idx_without_data = np.where(np.diff(idx_timesteps) == 1)[0].flatten().astype(int)
90
+ idx_timesteps_without_data = idx_timesteps[idx_without_data]
91
+ df = df.drop(labels=idx_timesteps_without_data)
92
+
93
+ # If the last row is a timestep, remove it
94
+ if df["TO_BE_PARSED"].str.len().iloc[-1] == 20:
95
+ df = df[:-1]
96
+
97
+ # Check there are data to process
98
+ if len(df) == 0 or len(df) == 1:
99
+ raise ValueError("No data to process.")
100
+
101
+ # Retrieve time
102
+ df_time = df[::2]
103
+ df_time = df_time.reset_index(drop=True)
104
+
105
+ # Retrieve data
106
+ df_data = df[1::2]
107
+ df_data = df_data.reset_index(drop=True)
108
+
109
+ if len(df_time) != len(df_data):
110
+ raise ValueError("Likely corrupted data. Not same number of timesteps and data.")
111
+
112
+ # Remove starting - from timestep
113
+ df_time = df_time["TO_BE_PARSED"].str.replace("-", "", n=1)
114
+
115
+ # Create dataframe
116
+ df_data["time"] = df_time.to_numpy()
117
+
118
+ # Count number of delimiters to identify valid rows
119
+ df_data = df_data[df_data["TO_BE_PARSED"].str.count(";") == 1104]
120
+
121
+ # Split by ; delimiter
122
+ df = df_data["TO_BE_PARSED"].str.split(";", expand=True, n=16)
123
+
124
+ # Assign column names
125
+ column_names = [
126
+ "rainfall_rate_32bit",
127
+ "rainfall_accumulated_32bit",
128
+ "weather_code_synop_4680",
129
+ "weather_code_synop_4677",
130
+ "weather_code_metar_4678",
131
+ "reflectivity_32bit",
132
+ "mor_visibility",
133
+ "laser_amplitude",
134
+ "number_particles",
135
+ "unknown1",
136
+ "sensor_battery_voltage",
137
+ "sensor_status",
138
+ "station_name",
139
+ "sensor_temperature",
140
+ "rainfall_amount_absolute_32bit",
141
+ "error_code",
142
+ "RAW_TO_PARSE",
143
+ ]
144
+
145
+ df.columns = column_names
146
+ # Add valid timestep
147
+ df["time"] = pd.to_datetime(df_data["time"], format="%Y-%m-%d %H:%M:%S")
148
+
149
+ # Add raw array
150
+ df["raw_drop_concentration"] = df["RAW_TO_PARSE"].str[:224]
151
+ df["raw_drop_average_velocity"] = df["RAW_TO_PARSE"].str[224:448]
152
+ df["raw_drop_number"] = df["RAW_TO_PARSE"].str[448:]
153
+
154
+ # Drop columns not agreeing with DISDRODB L0 standards
155
+ df = df.drop(columns=["station_name", "RAW_TO_PARSE", "unknown1"])
156
+
157
+ return df