disdrodb 0.0.21__py3-none-any.whl → 0.1.1__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 (279) 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 +306 -270
  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 +46 -51
  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 +84 -65
  57. disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_encodings.yml +50 -9
  58. disdrodb/l0/configs/{Thies_LPM → LPM}/raw_data_format.yml +285 -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 +23 -21
  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 +28 -26
  69. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_encodings.yml +20 -20
  70. disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/raw_data_format.yml +107 -107
  71. disdrodb/l0/configs/PWS100/bins_diameter.yml +173 -0
  72. disdrodb/l0/configs/PWS100/bins_velocity.yml +173 -0
  73. disdrodb/l0/configs/PWS100/l0a_encodings.yml +19 -0
  74. disdrodb/l0/configs/PWS100/l0b_cf_attrs.yml +76 -0
  75. disdrodb/l0/configs/PWS100/l0b_encodings.yml +176 -0
  76. disdrodb/l0/configs/PWS100/raw_data_format.yml +182 -0
  77. disdrodb/l0/configs/{RD_80 → RD80}/bins_diameter.yml +40 -40
  78. disdrodb/l0/configs/RD80/l0a_encodings.yml +16 -0
  79. disdrodb/l0/configs/{RD_80 → RD80}/l0b_cf_attrs.yml +3 -3
  80. disdrodb/l0/configs/RD80/l0b_encodings.yml +135 -0
  81. disdrodb/l0/configs/{RD_80 → RD80}/raw_data_format.yml +46 -50
  82. disdrodb/l0/l0_reader.py +216 -340
  83. disdrodb/l0/l0a_processing.py +237 -208
  84. disdrodb/l0/l0b_nc_processing.py +227 -80
  85. disdrodb/l0/l0b_processing.py +96 -174
  86. disdrodb/l0/l0c_processing.py +627 -0
  87. disdrodb/l0/readers/{ARM → LPM/ARM}/ARM_LPM.py +36 -58
  88. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +236 -0
  89. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +185 -0
  90. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +185 -0
  91. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +195 -0
  92. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +210 -0
  93. disdrodb/l0/readers/{BRAZIL/GOAMAZON_LPM.py → LPM/KIT/CHWALA.py} +97 -76
  94. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +197 -0
  95. disdrodb/l0/readers/LPM/SLOVENIA/CRNI_VRH.py +197 -0
  96. disdrodb/l0/readers/{UK → LPM/UK}/DIVEN.py +14 -35
  97. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +157 -0
  98. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +113 -0
  99. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/ARCTIC_2021.py +40 -57
  100. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/COMMON_2011.py +37 -54
  101. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/DAVOS_2009_2011.py +34 -51
  102. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_2009.py +34 -51
  103. disdrodb/l0/readers/{EPFL/PARADISO_2014.py → PARSIVEL/EPFL/EPFL_ROOF_2008.py} +38 -50
  104. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +105 -0
  105. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2011.py +34 -51
  106. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2012.py +33 -51
  107. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GENEPI_2007.py +25 -44
  108. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007.py +25 -44
  109. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007_2.py +25 -44
  110. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HPICONET_2010.py +34 -51
  111. disdrodb/l0/readers/{EPFL/EPFL_ROOF_2010.py → PARSIVEL/EPFL/HYMEX_LTE_SOP2.py} +37 -50
  112. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +111 -0
  113. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HYMEX_LTE_SOP4.py +36 -54
  114. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2018.py +34 -52
  115. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2019.py +38 -56
  116. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +105 -0
  117. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PARSIVEL_2007.py +27 -45
  118. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PLATO_2019.py +24 -44
  119. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +140 -0
  120. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RACLETS_2019_WJF.py +41 -59
  121. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RIETHOLZBACH_2011.py +34 -51
  122. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +117 -0
  123. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +137 -0
  124. disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/UNIL_2022.py +42 -55
  125. disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +104 -0
  126. disdrodb/l0/readers/{GPM → PARSIVEL/GPM}/LPVEX.py +29 -48
  127. disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +184 -0
  128. disdrodb/l0/readers/PARSIVEL/KIT/BURKINA_FASO.py +133 -0
  129. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +113 -0
  130. disdrodb/l0/readers/{NCAR/VORTEX_SE_2016_P1.py → PARSIVEL/NCAR/OWLES_MIPS.py} +46 -72
  131. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +125 -0
  132. disdrodb/l0/readers/{NCAR/OWLES_MIPS.py → PARSIVEL/NCAR/PLOWS_MIPS.py} +45 -64
  133. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +114 -0
  134. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +176 -0
  135. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +183 -0
  136. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL_FGG.py +121 -0
  137. disdrodb/l0/readers/{ARM/ARM_LD.py → PARSIVEL2/ARM/ARM_PARSIVEL2.py} +27 -50
  138. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +163 -0
  139. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +163 -0
  140. disdrodb/l0/readers/{DENMARK → PARSIVEL2/DENMARK}/EROSION_nc.py +14 -35
  141. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +189 -0
  142. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +119 -0
  143. disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +104 -0
  144. disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +176 -0
  145. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +32 -0
  146. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +56 -0
  147. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +120 -0
  148. disdrodb/l0/readers/{NCAR → PARSIVEL2/NCAR}/PECAN_MIPS.py +45 -64
  149. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +181 -0
  150. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +160 -0
  151. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +160 -0
  152. disdrodb/l0/readers/{NCAR/PLOWS_MIPS.py → PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py} +49 -66
  153. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +118 -0
  154. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +152 -0
  155. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT.py +166 -0
  156. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +150 -0
  157. disdrodb/l0/readers/{NCAR/RELAMPAGO_RD80.py → RD80/BRAZIL/CHUVA_RD80.py} +36 -60
  158. disdrodb/l0/readers/{BRAZIL → RD80/BRAZIL}/GOAMAZON_RD80.py +36 -55
  159. disdrodb/l0/readers/{NCAR → RD80/NCAR}/CINDY_2011_RD80.py +35 -54
  160. disdrodb/l0/readers/{BRAZIL/CHUVA_RD80.py → RD80/NCAR/RELAMPAGO_RD80.py} +40 -54
  161. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +274 -0
  162. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +62 -0
  163. disdrodb/l0/readers/{reader_template.py → template_reader_raw_text_data.py} +20 -44
  164. disdrodb/l0/routines.py +885 -581
  165. disdrodb/l0/standards.py +77 -238
  166. disdrodb/l0/template_tools.py +105 -110
  167. disdrodb/l1/__init__.py +17 -0
  168. disdrodb/l1/beard_model.py +716 -0
  169. disdrodb/l1/encoding_attrs.py +635 -0
  170. disdrodb/l1/fall_velocity.py +260 -0
  171. disdrodb/l1/filters.py +192 -0
  172. disdrodb/l1/processing.py +202 -0
  173. disdrodb/l1/resampling.py +236 -0
  174. disdrodb/l1/routines.py +358 -0
  175. disdrodb/l1_env/__init__.py +17 -0
  176. disdrodb/l1_env/routines.py +38 -0
  177. disdrodb/l2/__init__.py +17 -0
  178. disdrodb/l2/empirical_dsd.py +1833 -0
  179. disdrodb/l2/event.py +388 -0
  180. disdrodb/l2/processing.py +528 -0
  181. disdrodb/l2/processing_options.py +213 -0
  182. disdrodb/l2/routines.py +868 -0
  183. disdrodb/metadata/__init__.py +9 -2
  184. disdrodb/metadata/checks.py +180 -124
  185. disdrodb/metadata/download.py +81 -0
  186. disdrodb/metadata/geolocation.py +146 -0
  187. disdrodb/metadata/info.py +20 -13
  188. disdrodb/metadata/manipulation.py +3 -3
  189. disdrodb/metadata/reader.py +59 -8
  190. disdrodb/metadata/search.py +77 -144
  191. disdrodb/metadata/standards.py +83 -80
  192. disdrodb/metadata/writer.py +10 -16
  193. disdrodb/psd/__init__.py +38 -0
  194. disdrodb/psd/fitting.py +2146 -0
  195. disdrodb/psd/models.py +774 -0
  196. disdrodb/routines.py +1412 -0
  197. disdrodb/scattering/__init__.py +28 -0
  198. disdrodb/scattering/axis_ratio.py +344 -0
  199. disdrodb/scattering/routines.py +456 -0
  200. disdrodb/utils/__init__.py +17 -0
  201. disdrodb/utils/attrs.py +208 -0
  202. disdrodb/utils/cli.py +269 -0
  203. disdrodb/utils/compression.py +60 -42
  204. disdrodb/utils/dask.py +62 -0
  205. disdrodb/utils/dataframe.py +342 -0
  206. disdrodb/utils/decorators.py +110 -0
  207. disdrodb/utils/directories.py +107 -46
  208. disdrodb/utils/encoding.py +127 -0
  209. disdrodb/utils/list.py +29 -0
  210. disdrodb/utils/logger.py +168 -46
  211. disdrodb/utils/time.py +657 -0
  212. disdrodb/utils/warnings.py +30 -0
  213. disdrodb/utils/writer.py +57 -0
  214. disdrodb/utils/xarray.py +138 -47
  215. disdrodb/utils/yaml.py +0 -1
  216. disdrodb/viz/__init__.py +17 -0
  217. disdrodb/viz/plots.py +17 -0
  218. disdrodb-0.1.1.dist-info/METADATA +294 -0
  219. disdrodb-0.1.1.dist-info/RECORD +232 -0
  220. {disdrodb-0.0.21.dist-info → disdrodb-0.1.1.dist-info}/WHEEL +1 -1
  221. disdrodb-0.1.1.dist-info/entry_points.txt +30 -0
  222. disdrodb/data_transfer/scripts/disdrodb_download_archive.py +0 -53
  223. disdrodb/data_transfer/scripts/disdrodb_upload_archive.py +0 -57
  224. disdrodb/l0/configs/OTT_Parsivel/l0a_encodings.yml +0 -32
  225. disdrodb/l0/configs/OTT_Parsivel2/l0a_encodings.yml +0 -39
  226. disdrodb/l0/configs/RD_80/l0a_encodings.yml +0 -16
  227. disdrodb/l0/configs/RD_80/l0b_encodings.yml +0 -135
  228. disdrodb/l0/configs/Thies_LPM/l0a_encodings.yml +0 -80
  229. disdrodb/l0/io.py +0 -257
  230. disdrodb/l0/l0_processing.py +0 -1091
  231. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_OTT.py +0 -178
  232. disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_THIES.py +0 -247
  233. disdrodb/l0/readers/BRAZIL/CHUVA_LPM.py +0 -204
  234. disdrodb/l0/readers/BRAZIL/CHUVA_OTT.py +0 -183
  235. disdrodb/l0/readers/BRAZIL/GOAMAZON_OTT.py +0 -183
  236. disdrodb/l0/readers/CHINA/CHONGQING.py +0 -131
  237. disdrodb/l0/readers/EPFL/EPFL_ROOF_2008.py +0 -128
  238. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP2.py +0 -127
  239. disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP3.py +0 -129
  240. disdrodb/l0/readers/EPFL/RACLETS_2019.py +0 -158
  241. disdrodb/l0/readers/EPFL/SAMOYLOV_2017.py +0 -136
  242. disdrodb/l0/readers/EPFL/SAMOYLOV_2019.py +0 -158
  243. disdrodb/l0/readers/FRANCE/SIRTA_OTT2.py +0 -138
  244. disdrodb/l0/readers/GPM/GCPEX.py +0 -123
  245. disdrodb/l0/readers/GPM/IFLOODS.py +0 -123
  246. disdrodb/l0/readers/GPM/MC3E.py +0 -123
  247. disdrodb/l0/readers/GPM/NSSTC.py +0 -164
  248. disdrodb/l0/readers/ITALY/GID.py +0 -199
  249. disdrodb/l0/readers/MEXICO/OH_IIUNAM_nc.py +0 -92
  250. disdrodb/l0/readers/NCAR/CCOPE_2015.py +0 -133
  251. disdrodb/l0/readers/NCAR/PECAN_FP3.py +0 -137
  252. disdrodb/l0/readers/NCAR/PECAN_MOBILE.py +0 -144
  253. disdrodb/l0/readers/NCAR/RELAMPAGO_OTT.py +0 -195
  254. disdrodb/l0/readers/NCAR/SNOWIE_PJ.py +0 -172
  255. disdrodb/l0/readers/NCAR/SNOWIE_SB.py +0 -179
  256. disdrodb/l0/readers/NCAR/VORTEX2_2009.py +0 -133
  257. disdrodb/l0/readers/NCAR/VORTEX2_2010.py +0 -188
  258. disdrodb/l0/readers/NCAR/VORTEX2_2010_UF.py +0 -191
  259. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_P2.py +0 -135
  260. disdrodb/l0/readers/NCAR/VORTEX_SE_2016_PIPS.py +0 -170
  261. disdrodb/l0/readers/NETHERLANDS/DELFT.py +0 -187
  262. disdrodb/l0/readers/SPAIN/SBEGUERIA.py +0 -179
  263. disdrodb/l0/scripts/disdrodb_run_l0b_concat.py +0 -93
  264. disdrodb/l0/scripts/disdrodb_run_l0b_concat_station.py +0 -85
  265. disdrodb/utils/netcdf.py +0 -452
  266. disdrodb/utils/scripts.py +0 -102
  267. disdrodb-0.0.21.dist-info/AUTHORS.md +0 -18
  268. disdrodb-0.0.21.dist-info/METADATA +0 -186
  269. disdrodb-0.0.21.dist-info/RECORD +0 -168
  270. disdrodb-0.0.21.dist-info/entry_points.txt +0 -15
  271. /disdrodb/l0/configs/{RD_80 → RD80}/bins_velocity.yml +0 -0
  272. /disdrodb/l0/manuals/{Thies_LPM.pdf → LPM.pdf} +0 -0
  273. /disdrodb/l0/manuals/{ODM_470.pdf → ODM470.pdf} +0 -0
  274. /disdrodb/l0/manuals/{OTT_Parsivel.pdf → PARSIVEL.pdf} +0 -0
  275. /disdrodb/l0/manuals/{OTT_Parsivel2.pdf → PARSIVEL2.pdf} +0 -0
  276. /disdrodb/l0/manuals/{PWS_100.pdf → PWS100.pdf} +0 -0
  277. /disdrodb/l0/manuals/{RD_80.pdf → RD80.pdf} +0 -0
  278. {disdrodb-0.0.21.dist-info → disdrodb-0.1.1.dist-info/licenses}/LICENSE +0 -0
  279. {disdrodb-0.0.21.dist-info → disdrodb-0.1.1.dist-info}/top_level.txt +0 -0
@@ -16,21 +16,23 @@
16
16
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  # -----------------------------------------------------------------------------.
18
18
  """Reader for ARM Thies LPM sensor."""
19
- from disdrodb.l0 import run_l0b_from_nc
20
19
  from disdrodb.l0.l0_reader import is_documented_by, reader_generic_docstring
20
+ from disdrodb.l0.l0b_nc_processing import open_raw_netcdf_file, replace_custom_nan_flags, standardize_raw_dataset
21
21
 
22
22
 
23
23
  @is_documented_by(reader_generic_docstring)
24
24
  def reader(
25
- raw_dir,
26
- processed_dir,
27
- station_name,
28
- # Processing options
29
- force=False,
30
- verbose=False,
31
- parallel=False,
32
- debugging_mode=False,
25
+ filepath,
26
+ logger=None,
33
27
  ):
28
+ """Reader."""
29
+ ##------------------------------------------------------------------------.
30
+ #### Open the netCDF
31
+ ds = open_raw_netcdf_file(filepath=filepath, logger=logger)
32
+
33
+ ##------------------------------------------------------------------------.
34
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
35
+ # Define dictionary mapping dataset variables to select and rename
34
36
  dict_names = {
35
37
  ## Dimensions
36
38
  "particle_diameter": "diameter_bin_center",
@@ -99,54 +101,30 @@ def reader(
99
101
  # 'air_temperature',
100
102
  }
101
103
 
102
- # Define dataset sanitizer
103
- def ds_sanitizer_fun(ds):
104
- from disdrodb.l0.l0b_nc_processing import replace_custom_nan_flags
105
-
106
- # Replace nan flags with np.nan
107
- # - ARM use the -9999 flags
108
- nan_flags_variables = [
109
- "weather_code_synop_4677_5min",
110
- "weather_code_synop_4680_5min",
111
- "weather_code_synop_4680",
112
- "weather_code_synop_4677",
113
- "mor_visibility",
114
- "quality_index",
115
- "temperature_interior",
116
- "laser_temperature",
117
- "laser_current_average",
118
- "number_particles",
119
- "number_particles_min_speed",
120
- "number_particles_max_speed",
121
- "number_particles_min_diameter",
122
- "number_particles_max_diameter",
123
- "raw_drop_number",
124
- ]
125
- dict_nan_flags = {var: [-9999] for var in nan_flags_variables}
126
- ds = replace_custom_nan_flags(ds, dict_nan_flags=dict_nan_flags)
127
-
128
- # Return dataset
129
- return ds
130
-
131
- # Define glob pattern to search data files in <raw_dir>/data/<station_name>
132
- glob_patterns = "*.nc"
133
-
134
- ####----------------------------------------------------------------------.
135
- #### - Create L0A products
136
- run_l0b_from_nc(
137
- raw_dir=raw_dir,
138
- processed_dir=processed_dir,
139
- station_name=station_name,
140
- # Custom arguments of the reader
141
- glob_patterns=glob_patterns,
142
- dict_names=dict_names,
143
- ds_sanitizer_fun=ds_sanitizer_fun,
144
- # Processing options
145
- force=force,
146
- verbose=verbose,
147
- parallel=parallel,
148
- debugging_mode=debugging_mode,
149
- )
104
+ # Rename dataset variables and columns and infill missing variables
105
+ ds = standardize_raw_dataset(ds=ds, dict_names=dict_names, sensor_name="LPM")
150
106
 
107
+ # Replace nan flags with np.nan
108
+ # - ARM use the -9999 flags
109
+ nan_flags_variables = [
110
+ "weather_code_synop_4677_5min",
111
+ "weather_code_synop_4680_5min",
112
+ "weather_code_synop_4680",
113
+ "weather_code_synop_4677",
114
+ "mor_visibility",
115
+ "quality_index",
116
+ "temperature_interior",
117
+ "laser_temperature",
118
+ "laser_current_average",
119
+ "number_particles",
120
+ "number_particles_min_speed",
121
+ "number_particles_max_speed",
122
+ "number_particles_min_diameter",
123
+ "number_particles_max_diameter",
124
+ "raw_drop_number",
125
+ ]
126
+ dict_nan_flags = {var: [-9999] for var in nan_flags_variables}
127
+ ds = replace_custom_nan_flags(ds, dict_nan_flags=dict_nan_flags, logger=logger)
151
128
 
152
- # -----------------------------------------------------------------.
129
+ # Return the dataset adhering to DISDRODB L0B standards
130
+ return ds
@@ -0,0 +1,236 @@
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
+ # - Define delimiter
39
+ reader_kwargs["delimiter"] = "#"
40
+ # Skip first row as columns names
41
+ reader_kwargs["header"] = None
42
+ # Skip first 3 rows
43
+ reader_kwargs["skiprows"] = 2
44
+ # - Avoid first column to become df index !!!
45
+ reader_kwargs["index_col"] = False
46
+ # - Define behaviour when encountering bad lines
47
+ reader_kwargs["on_bad_lines"] = "skip"
48
+ # - Define reader engine
49
+ # - C engine is faster
50
+ # - Python engine is more feature-complete
51
+ reader_kwargs["engine"] = "python"
52
+ # - Define on-the-fly decompression of on-disk data
53
+ # - Available: gzip, bz2, zip
54
+ reader_kwargs["compression"] = "infer"
55
+ # - Strings to recognize as NA/NaN and replace with standard NA flags
56
+ # - Already included: '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
57
+ # '-NaN', '-nan', '1.#IND', '1.#QNAN', '<NA>', 'N/A',
58
+ # 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'
59
+ reader_kwargs["na_values"] = ["na", "", "error", "NA"] # NP
60
+
61
+ ##------------------------------------------------------------------------.
62
+ #### Read the data
63
+ df = read_raw_text_file(
64
+ filepath=filepath,
65
+ column_names=column_names,
66
+ reader_kwargs=reader_kwargs,
67
+ logger=logger,
68
+ )
69
+
70
+ ##------------------------------------------------------------------------.
71
+ #### Adapt the dataframe to adhere to DISDRODB L0 standards
72
+ # Remove rows with invalid length
73
+ # - time: 20
74
+ # - data: 2229
75
+ df = df[df["TO_BE_PARSED"].str.len().isin([20, 2229])]
76
+ df = df.reset_index(drop=True)
77
+ # Remove rows with consecutive timesteps
78
+ # - Keep last timestep occurrence
79
+ idx_timesteps = np.where(df["TO_BE_PARSED"].str.len() == 20)[0]
80
+ idx_without_data = np.where(np.diff(idx_timesteps) == 1)[0].flatten().astype(int)
81
+ idx_timesteps_without_data = idx_timesteps[idx_without_data]
82
+ df = df.drop(labels=idx_timesteps_without_data)
83
+
84
+ # If the last row is a timestep, remove it
85
+ if df["TO_BE_PARSED"].str.len().iloc[-1] == 20:
86
+ df = df[:-1]
87
+
88
+ # Check there are data to process
89
+ if len(df) == 0 or len(df) == 1:
90
+ raise ValueError("No data to process.")
91
+
92
+ # Retrieve time column and format in datetime64
93
+ df_time = df[::2]
94
+ df_time = df_time.reset_index(drop=True)
95
+ df_time = df_time["TO_BE_PARSED"].str.replace("-", "", n=1)
96
+ df_time = pd.to_datetime(df_time, format="%Y-%m-%d %H:%M:%S", errors="coerce")
97
+
98
+ # Retrieve data
99
+ df_data = df[1::2]
100
+ df_data = df_data.reset_index(drop=True)
101
+
102
+ if len(df_time) != len(df_data):
103
+ raise ValueError("Likely corrupted data. Not same number of timesteps and data.")
104
+
105
+ # Create dataframe
106
+ df_data["time"] = df_time.to_numpy()
107
+
108
+ # Drop rows with invalid time
109
+ df_data = df_data.dropna(subset="time")
110
+
111
+ # Count number of delimiters to identify valid rows
112
+ df_data = df_data[df_data["TO_BE_PARSED"].str.count(";") == 524]
113
+
114
+ # Split by ; delimiter
115
+ df = df_data["TO_BE_PARSED"].str.split(";", expand=True, n=79)
116
+
117
+ # Assign column names
118
+ column_names = [
119
+ "start_identifier",
120
+ "device_address",
121
+ "sensor_serial_number",
122
+ "sensor_date",
123
+ "sensor_time",
124
+ "weather_code_synop_4677_5min",
125
+ "weather_code_synop_4680_5min",
126
+ "weather_code_metar_4678_5min",
127
+ "precipitation_rate_5min",
128
+ "weather_code_synop_4677",
129
+ "weather_code_synop_4680",
130
+ "weather_code_metar_4678",
131
+ "precipitation_rate",
132
+ "rainfall_rate",
133
+ "snowfall_rate",
134
+ "precipitation_accumulated",
135
+ "mor_visibility",
136
+ "reflectivity",
137
+ "quality_index",
138
+ "max_hail_diameter",
139
+ "laser_status",
140
+ "static_signal",
141
+ "laser_temperature_analog_status",
142
+ "laser_temperature_digital_status",
143
+ "laser_current_analog_status",
144
+ "laser_current_digital_status",
145
+ "sensor_voltage_supply_status",
146
+ "current_heating_pane_transmitter_head_status",
147
+ "current_heating_pane_receiver_head_status",
148
+ "temperature_sensor_status",
149
+ "current_heating_voltage_supply_status",
150
+ "current_heating_house_status",
151
+ "current_heating_heads_status",
152
+ "current_heating_carriers_status",
153
+ "control_output_laser_power_status",
154
+ "reserve_status",
155
+ "temperature_interior",
156
+ "laser_temperature",
157
+ "laser_current_average",
158
+ "control_voltage",
159
+ "optical_control_voltage_output",
160
+ "sensor_voltage_supply",
161
+ "current_heating_pane_transmitter_head",
162
+ "current_heating_pane_receiver_head",
163
+ "temperature_ambient",
164
+ "current_heating_voltage_supply",
165
+ "current_heating_house",
166
+ "current_heating_heads",
167
+ "current_heating_carriers",
168
+ "number_particles",
169
+ "number_particles_internal_data",
170
+ "number_particles_min_speed",
171
+ "number_particles_min_speed_internal_data",
172
+ "number_particles_max_speed",
173
+ "number_particles_max_speed_internal_data",
174
+ "number_particles_min_diameter",
175
+ "number_particles_min_diameter_internal_data",
176
+ "number_particles_no_hydrometeor",
177
+ "number_particles_no_hydrometeor_internal_data",
178
+ "number_particles_unknown_classification",
179
+ "number_particles_unknown_classification_internal_data",
180
+ "number_particles_class_1",
181
+ "number_particles_class_1_internal_data",
182
+ "number_particles_class_2",
183
+ "number_particles_class_2_internal_data",
184
+ "number_particles_class_3",
185
+ "number_particles_class_3_internal_data",
186
+ "number_particles_class_4",
187
+ "number_particles_class_4_internal_data",
188
+ "number_particles_class_5",
189
+ "number_particles_class_5_internal_data",
190
+ "number_particles_class_6",
191
+ "number_particles_class_6_internal_data",
192
+ "number_particles_class_7",
193
+ "number_particles_class_7_internal_data",
194
+ "number_particles_class_8",
195
+ "number_particles_class_8_internal_data",
196
+ "number_particles_class_9",
197
+ "number_particles_class_9_internal_data",
198
+ "TO_BE_FURTHER_PROCESSED",
199
+ ]
200
+ df.columns = column_names
201
+
202
+ # Extract the last variables remained in raw_drop_number
203
+ df_parsed = df["TO_BE_FURTHER_PROCESSED"].str.rsplit(";", n=6, expand=True)
204
+ df_parsed.columns = [
205
+ "raw_drop_number",
206
+ "air_temperature",
207
+ "relative_humidity",
208
+ "wind_speed",
209
+ "wind_direction",
210
+ "checksum",
211
+ "dummy",
212
+ ]
213
+
214
+ # Assign columns to the original dataframe
215
+ df[df_parsed.columns] = df_parsed
216
+
217
+ # Drop row if start_identifier different than 00
218
+ df["time"] = df_data["time"]
219
+ df = df[df["start_identifier"].astype(str) == "00"]
220
+
221
+ # Drop rows with invalid raw_drop_number
222
+ df = df[df["raw_drop_number"].astype(str).str.len() == 1759]
223
+
224
+ # Drop columns not agreeing with DISDRODB L0 standards
225
+ columns_to_drop = [
226
+ "start_identifier",
227
+ "device_address",
228
+ "sensor_serial_number",
229
+ "sensor_date",
230
+ "sensor_time",
231
+ "TO_BE_FURTHER_PROCESSED",
232
+ "checksum",
233
+ "dummy",
234
+ ]
235
+ df = df.drop(columns=columns_to_drop)
236
+ return df
@@ -0,0 +1,185 @@
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
+ # TODO: correct time is unavailable yet !
166
+
167
+ # Drop row if start_identifier different than 00
168
+ df = df[df["start_identifier"].astype(str) == "00"]
169
+
170
+ # Remove checksum from raw_drop_number
171
+ df["raw_drop_number"] = df["raw_drop_number"].str.rsplit(";", n=2, expand=True)[0]
172
+
173
+ # Drop rows with invalid raw_drop_number
174
+ df = df[df["raw_drop_number"].astype(str).str.len() == 1759]
175
+
176
+ # Drop columns not agreeing with DISDRODB L0 standards
177
+ columns_to_drop = [
178
+ "start_identifier",
179
+ "device_address",
180
+ "sensor_serial_number",
181
+ "sensor_date",
182
+ "sensor_time",
183
+ ]
184
+ df = df.drop(columns=columns_to_drop)
185
+ return df