disdrodb 0.2.0__py3-none-any.whl → 0.3.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 (315) hide show
  1. disdrodb/__init__.py +1 -1
  2. disdrodb/_config.py +1 -3
  3. disdrodb/_version.py +2 -2
  4. disdrodb/accessor/__init__.py +1 -1
  5. disdrodb/accessor/methods.py +18 -11
  6. disdrodb/api/checks.py +2 -4
  7. disdrodb/api/configs.py +1 -3
  8. disdrodb/api/create_directories.py +4 -6
  9. disdrodb/api/info.py +1 -3
  10. disdrodb/api/io.py +15 -9
  11. disdrodb/api/path.py +1 -3
  12. disdrodb/cli/disdrodb_check_metadata_archive.py +2 -2
  13. disdrodb/cli/disdrodb_check_products_options.py +44 -0
  14. disdrodb/cli/disdrodb_create_summary.py +48 -22
  15. disdrodb/cli/disdrodb_create_summary_station.py +39 -18
  16. disdrodb/cli/disdrodb_data_archive_directory.py +1 -3
  17. disdrodb/cli/disdrodb_download_archive.py +45 -24
  18. disdrodb/cli/disdrodb_download_metadata_archive.py +27 -16
  19. disdrodb/cli/disdrodb_download_station.py +56 -26
  20. disdrodb/cli/disdrodb_initialize_station.py +40 -20
  21. disdrodb/cli/disdrodb_metadata_archive_directory.py +1 -3
  22. disdrodb/cli/disdrodb_open_data_archive.py +16 -11
  23. disdrodb/cli/disdrodb_open_logs_directory.py +29 -18
  24. disdrodb/cli/disdrodb_open_metadata_archive.py +25 -11
  25. disdrodb/cli/disdrodb_open_metadata_directory.py +32 -20
  26. disdrodb/cli/disdrodb_open_product_directory.py +38 -21
  27. disdrodb/cli/disdrodb_open_readers_directory.py +1 -3
  28. disdrodb/cli/disdrodb_run.py +189 -0
  29. disdrodb/cli/disdrodb_run_l0.py +55 -64
  30. disdrodb/cli/disdrodb_run_l0_station.py +47 -52
  31. disdrodb/cli/disdrodb_run_l0a.py +47 -45
  32. disdrodb/cli/disdrodb_run_l0a_station.py +38 -37
  33. disdrodb/cli/disdrodb_run_l0b.py +45 -45
  34. disdrodb/cli/disdrodb_run_l0b_station.py +37 -36
  35. disdrodb/cli/disdrodb_run_l0c.py +50 -47
  36. disdrodb/cli/disdrodb_run_l0c_station.py +41 -38
  37. disdrodb/cli/disdrodb_run_l1.py +49 -45
  38. disdrodb/cli/disdrodb_run_l1_station.py +40 -37
  39. disdrodb/cli/disdrodb_run_l2e.py +50 -45
  40. disdrodb/cli/disdrodb_run_l2e_station.py +41 -37
  41. disdrodb/cli/disdrodb_run_l2m.py +49 -45
  42. disdrodb/cli/disdrodb_run_l2m_station.py +40 -37
  43. disdrodb/cli/disdrodb_run_station.py +184 -0
  44. disdrodb/cli/disdrodb_upload_archive.py +45 -35
  45. disdrodb/cli/disdrodb_upload_station.py +39 -32
  46. disdrodb/configs.py +13 -8
  47. disdrodb/constants.py +4 -2
  48. disdrodb/data_transfer/__init__.py +1 -3
  49. disdrodb/data_transfer/download_data.py +38 -54
  50. disdrodb/data_transfer/upload_data.py +1 -3
  51. disdrodb/data_transfer/zenodo.py +1 -3
  52. disdrodb/docs.py +1 -3
  53. disdrodb/etc/configs/attributes.yaml +52 -2
  54. disdrodb/etc/configs/encodings.yaml +45 -1
  55. disdrodb/etc/products/L0C/ODM470/global.yaml +5 -0
  56. disdrodb/etc/products/L0C/global.yaml +5 -0
  57. disdrodb/etc/products/L1/ODM470/global.yaml +6 -0
  58. disdrodb/etc/products/L1/global.yaml +1 -14
  59. disdrodb/etc/products/L2E/LPM/1MIN.yaml +1 -0
  60. disdrodb/etc/products/L2E/LPM/global.yaml +36 -0
  61. disdrodb/etc/products/L2E/LPM_V0/1MIN.yaml +1 -0
  62. disdrodb/etc/products/L2E/LPM_V0/global.yaml +36 -0
  63. disdrodb/etc/products/L2E/ODM470/1MIN.yaml +1 -0
  64. disdrodb/etc/products/L2E/ODM470/global.yaml +36 -0
  65. disdrodb/etc/products/L2E/PARSIVEL/1MIN.yaml +1 -0
  66. disdrodb/etc/products/L2E/PARSIVEL/global.yaml +36 -0
  67. disdrodb/etc/products/L2E/PARSIVEL2/1MIN.yaml +1 -0
  68. disdrodb/etc/products/L2E/PARSIVEL2/global.yaml +36 -0
  69. disdrodb/etc/products/L2E/PWS100/1MIN.yaml +1 -0
  70. disdrodb/etc/products/L2E/PWS100/global.yaml +36 -0
  71. disdrodb/etc/products/L2E/RD80/1MIN.yaml +19 -0
  72. disdrodb/etc/products/L2E/SWS250/1MIN.yaml +19 -0
  73. disdrodb/etc/products/L2E/global.yaml +17 -3
  74. disdrodb/etc/products/L2M/global.yaml +1 -1
  75. disdrodb/fall_velocity/__init__.py +46 -0
  76. disdrodb/fall_velocity/graupel.py +483 -0
  77. disdrodb/fall_velocity/hail.py +287 -0
  78. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -50
  79. disdrodb/issue/__init__.py +1 -3
  80. disdrodb/issue/checks.py +3 -5
  81. disdrodb/issue/reader.py +1 -3
  82. disdrodb/issue/writer.py +1 -3
  83. disdrodb/l0/__init__.py +1 -1
  84. disdrodb/l0/check_configs.py +26 -17
  85. disdrodb/l0/check_standards.py +1 -3
  86. disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -1
  87. disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +0 -4
  88. disdrodb/l0/configs/LPM/l0b_encodings.yml +9 -9
  89. disdrodb/l0/configs/LPM/raw_data_format.yml +11 -11
  90. disdrodb/l0/configs/LPM_V0/bins_diameter.yml +103 -0
  91. disdrodb/l0/configs/LPM_V0/bins_velocity.yml +103 -0
  92. disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +45 -0
  93. disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +180 -0
  94. disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +410 -0
  95. disdrodb/l0/configs/LPM_V0/raw_data_format.yml +474 -0
  96. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  97. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  98. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  99. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  100. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  101. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  102. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  103. disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +8 -8
  104. disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +9 -9
  105. disdrodb/l0/l0_reader.py +1 -3
  106. disdrodb/l0/l0a_processing.py +7 -5
  107. disdrodb/l0/l0b_nc_processing.py +2 -4
  108. disdrodb/l0/l0b_processing.py +27 -22
  109. disdrodb/l0/l0c_processing.py +37 -11
  110. disdrodb/l0/manuals/LPM_V0.pdf +0 -0
  111. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
  112. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
  113. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
  114. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
  115. disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
  116. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +63 -14
  117. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +279 -0
  118. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +279 -0
  119. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +3 -5
  120. disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
  121. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  122. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +103 -0
  123. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +214 -0
  124. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +206 -0
  125. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
  126. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
  127. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
  128. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  129. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +217 -0
  130. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +227 -0
  131. disdrodb/l0/readers/{LPM → LPM_V0}/BELGIUM/ULIEGE.py +34 -52
  132. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +240 -0
  133. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
  134. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  135. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
  136. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
  137. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
  151. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
  152. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  154. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
  155. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
  156. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  157. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
  158. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
  159. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
  160. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
  161. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  164. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  165. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +26 -14
  166. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +2 -2
  167. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  169. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  170. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  171. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  172. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  173. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  174. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
  175. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
  176. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -2
  177. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
  178. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  179. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  180. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  181. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  182. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
  183. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
  184. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  185. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
  186. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
  187. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  188. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  189. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  190. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
  191. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +155 -0
  192. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  193. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  195. disdrodb/l0/readers/PARSIVEL2/{NASA/GCPEX.py → KOREA/ICEPOP_UCLM.py} +51 -31
  196. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +15 -8
  198. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +9 -4
  199. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +31 -6
  200. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  201. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
  202. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  204. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
  206. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +2 -2
  207. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  208. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  209. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
  210. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  211. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
  212. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  213. disdrodb/l0/readers/{PARSIVEL/NASA/PIERS.py → PARSIVEL2/NORWAY/UIB.py} +65 -31
  214. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +7 -6
  215. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  216. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  217. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
  218. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  219. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
  220. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +138 -0
  221. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +49 -22
  222. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
  223. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
  224. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
  225. disdrodb/l0/readers/{PARSIVEL/NASA/IFLOODS.py → RD80/BRAZIL/ATTO_RD80.py} +50 -36
  226. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  227. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  228. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  229. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  230. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
  231. disdrodb/l0/readers/{SW250 → SWS250}/BELGIUM/KMI.py +2 -4
  232. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
  233. disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
  234. disdrodb/l0/standards.py +4 -5
  235. disdrodb/l0/template_tools.py +1 -3
  236. disdrodb/l1/__init__.py +1 -1
  237. disdrodb/l1/classification.py +913 -0
  238. disdrodb/l1/processing.py +36 -106
  239. disdrodb/l1/resampling.py +8 -3
  240. disdrodb/l1_env/__init__.py +1 -1
  241. disdrodb/l1_env/routines.py +6 -6
  242. disdrodb/l2/__init__.py +1 -1
  243. disdrodb/l2/empirical_dsd.py +61 -31
  244. disdrodb/l2/processing.py +327 -62
  245. disdrodb/metadata/checks.py +1 -3
  246. disdrodb/metadata/download.py +4 -4
  247. disdrodb/metadata/geolocation.py +1 -3
  248. disdrodb/metadata/info.py +1 -3
  249. disdrodb/metadata/manipulation.py +1 -3
  250. disdrodb/metadata/reader.py +1 -3
  251. disdrodb/metadata/search.py +1 -3
  252. disdrodb/metadata/standards.py +1 -3
  253. disdrodb/metadata/writer.py +1 -3
  254. disdrodb/physics/__init__.py +17 -0
  255. disdrodb/physics/atmosphere.py +272 -0
  256. disdrodb/physics/water.py +130 -0
  257. disdrodb/physics/wrappers.py +62 -0
  258. disdrodb/psd/__init__.py +1 -1
  259. disdrodb/psd/fitting.py +22 -9
  260. disdrodb/psd/models.py +1 -1
  261. disdrodb/routines/__init__.py +5 -1
  262. disdrodb/routines/l0.py +28 -18
  263. disdrodb/routines/l1.py +8 -6
  264. disdrodb/routines/l2.py +8 -4
  265. disdrodb/routines/options.py +116 -71
  266. disdrodb/routines/options_validation.py +728 -0
  267. disdrodb/routines/wrappers.py +431 -11
  268. disdrodb/scattering/__init__.py +1 -1
  269. disdrodb/scattering/axis_ratio.py +9 -6
  270. disdrodb/scattering/permittivity.py +8 -8
  271. disdrodb/scattering/routines.py +32 -14
  272. disdrodb/summary/__init__.py +1 -1
  273. disdrodb/summary/routines.py +146 -86
  274. disdrodb/utils/__init__.py +1 -1
  275. disdrodb/utils/archiving.py +16 -9
  276. disdrodb/utils/attrs.py +4 -3
  277. disdrodb/utils/cli.py +8 -10
  278. disdrodb/utils/compression.py +13 -13
  279. disdrodb/utils/dask.py +33 -14
  280. disdrodb/utils/dataframe.py +1 -3
  281. disdrodb/utils/decorators.py +1 -3
  282. disdrodb/utils/dict.py +1 -1
  283. disdrodb/utils/directories.py +3 -5
  284. disdrodb/utils/encoding.py +2 -4
  285. disdrodb/utils/event.py +1 -1
  286. disdrodb/utils/list.py +1 -3
  287. disdrodb/utils/logger.py +1 -3
  288. disdrodb/utils/manipulations.py +182 -6
  289. disdrodb/utils/pydantic.py +80 -0
  290. disdrodb/utils/routines.py +1 -3
  291. disdrodb/utils/subsetting.py +1 -1
  292. disdrodb/utils/time.py +3 -2
  293. disdrodb/utils/warnings.py +1 -3
  294. disdrodb/utils/writer.py +1 -3
  295. disdrodb/utils/xarray.py +30 -3
  296. disdrodb/utils/yaml.py +1 -3
  297. disdrodb/viz/__init__.py +1 -1
  298. disdrodb/viz/plots.py +197 -21
  299. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
  300. disdrodb-0.3.0.dist-info/RECORD +358 -0
  301. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
  302. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  303. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  304. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  305. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  306. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  307. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  308. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  309. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  310. disdrodb/l1/beard_model.py +0 -618
  311. disdrodb/l1/filters.py +0 -203
  312. disdrodb-0.2.0.dist-info/RECORD +0 -312
  313. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
  314. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
  315. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -51,35 +49,44 @@ def disdrodb_upload_station(
51
49
  data_archive_dir: Optional[str] = None,
52
50
  metadata_archive_dir: Optional[str] = None,
53
51
  ):
54
- """
55
- Upload data from a single DISDRODB station on a remote repository.
56
-
57
- This function also automatically update the disdrodb_data url in the metadata file.
58
-
59
- Parameters
60
- ----------
61
- data_source : str
62
- The name of the institution (for campaigns spanning multiple countries) or
63
- the name of the country (for campaigns or sensor networks within a single country).
64
- Must be provided in UPPER CASE.
65
- campaign_name : str
66
- The name of the campaign. Must be provided in UPPER CASE.
67
- station_name : str
68
- The name of the station.
69
- data_archive_dir : str (optional)
70
- The directory path where the DISDRODB Data Archive is located.
71
- The directory path must end with ``<...>/DISDRODB``.
72
- If ``None``, it uses the ``data_archive_dir`` path specified
73
- in the DISDRODB active configuration.
74
- platform: str, optional
75
- Name of the remote data storage platform.
76
- The default platform is ``"sandbox.zenodo"`` (for testing purposes).
77
- Switch to ``"zenodo"`` for final data dissemination.
78
- force: bool, optional
79
- If ``True``, upload the data and overwrite the ``disdrodb_data_url``.
80
- The default value is ``force=False``.
81
-
82
- """
52
+ """Upload raw data from a single DISDRODB station to the DISDRODB Decentralized Data Archive.
53
+
54
+ Currently, only upload to the Zenodo data repository is implemented.
55
+
56
+ The station metadata file is automatically updated with the remote data URL.
57
+
58
+ PLEASE UPLOAD JUST YOUR DATA !
59
+
60
+
61
+ \b
62
+ Upload Behavior:
63
+ By default, upload is skipped if data already exists on a remote location.
64
+ Use '--force True' to upload even if data already exists remotely.
65
+ Warning: Forcing upload will overwrite the existing disdrodb_data_url in metadata.
66
+
67
+ \b
68
+ Upload Options:
69
+ --platform: Remote platform name (default: 'sandbox.zenodo' for testing)
70
+ Use 'zenodo' for final data dissemination
71
+ --force: Upload even if data already exists remotely (default: False)
72
+
73
+ \b
74
+ Archive Directories:
75
+ --data_archive_dir: Custom path to DISDRODB data archive
76
+ --metadata_archive_dir: Custom path to DISDRODB metadata archive
77
+ If not specified, paths from the active DISDRODB configuration are used
78
+
79
+ \b
80
+ Examples:
81
+ # Upload a station to sandbox for testing
82
+ disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME
83
+
84
+ # Upload a station to production Zenodo
85
+ disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME --platform zenodo
86
+
87
+ # Force upload and update metadata URL
88
+ disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME --force True
89
+ """ # noqa: D301
83
90
  from disdrodb.data_transfer.upload_data import upload_station
84
91
 
85
92
  data_archive_dir = parse_archive_dir(data_archive_dir)
disdrodb/configs.py CHANGED
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -194,7 +192,11 @@ def get_scattering_table_dir(scattering_table_dir=None):
194
192
  if scattering_table_dir is None:
195
193
  scattering_table_dir = disdrodb.config.get("scattering_table_dir", None)
196
194
  if scattering_table_dir is None:
197
- raise ValueError("The directory where to save DISDRODB T-Matrix scattering tables is not specified.")
195
+ msg = (
196
+ "The directory where to save DISDRODB T-Matrix scattering look-up tables is not specified. "
197
+ + "Please specify it using disdrodb.define_configs(scattering_table_dir=<path>)"
198
+ )
199
+ raise ValueError(msg)
198
200
  scattering_table_dir = check_scattering_table_dir(scattering_table_dir) # ensure Path converted to str
199
201
  return scattering_table_dir
200
202
 
@@ -246,16 +248,19 @@ def get_default_products_configs_dir():
246
248
  return products_configs_dir
247
249
 
248
250
 
249
- def get_products_configs_dir():
251
+ def get_products_configs_dir(products_configs_dir=None):
250
252
  """Return the DISDRODB products configuration directory."""
251
253
  import disdrodb
252
254
 
253
- if os.environ.get("PYTEST_CURRENT_TEST"):
255
+ if products_configs_dir is not None:
256
+ return str(products_configs_dir)
257
+
258
+ if os.environ.get("PYTEST_CURRENT_TEST") and not os.environ.get("DISDRODB_VALIDATION_FLAG"):
254
259
  products_configs_dir = os.path.join(disdrodb.package_dir, "tests", "products")
255
260
  else:
256
261
  products_configs_dir = disdrodb.config.get("products_configs_dir", None)
257
- if products_configs_dir is None:
258
- products_configs_dir = get_default_products_configs_dir()
262
+ if products_configs_dir is None: # not specified by user
263
+ products_configs_dir = get_default_products_configs_dir() # take disdrodb defaults
259
264
  return products_configs_dir
260
265
 
261
266
 
disdrodb/constants.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # -----------------------------------------------------------------------------.
2
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
3
3
  #
4
4
  # This program is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -41,7 +41,9 @@ COORDINATES = [
41
41
  "time",
42
42
  "sample_interval",
43
43
  ]
44
- OPTICAL_SENSORS = ["PARSIVEL", "PARSIVEL2", "LPM", "PWS100", "SWS250"]
44
+ METEOROLOGICAL_VARIABLES = ["air_temperature", "relative_humidity", "wind_speed", "wind_direction"]
45
+
46
+ OPTICAL_SENSORS = ["PARSIVEL", "PARSIVEL2", "LPM", "LPM_V0", "PWS100", "SWS250", "ODM470"]
45
47
  IMPACT_SENSORS = ["RD80"]
46
48
 
47
49
  PRODUCTS = ["RAW", "L0A", "L0B", "L0C", "L1", "L2E", "L2M"]
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -17,7 +15,6 @@
17
15
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
16
  # -----------------------------------------------------------------------------.
19
17
  """Routines to download data from the DISDRODB Decentralized Data Archive."""
20
-
21
18
  import logging
22
19
  import os
23
20
  import shutil
@@ -33,7 +30,7 @@ from disdrodb.api.path import define_metadata_filepath, define_station_dir
33
30
  from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
34
31
  from disdrodb.metadata import get_list_metadata
35
32
  from disdrodb.utils.compression import unzip_file
36
- from disdrodb.utils.directories import is_empty_directory
33
+ from disdrodb.utils.directories import is_empty_directory, remove_file_or_directories
37
34
  from disdrodb.utils.yaml import read_yaml
38
35
 
39
36
 
@@ -123,7 +120,7 @@ def download_archive(
123
120
  If not provided (``None``), all stations will be downloaded.
124
121
  The default value is ``station_name=None``.
125
122
  force : bool, optional
126
- If ``True``, overwrite the already existing raw data file.
123
+ If ``True``, delete existing files and re-download raw data files.
127
124
  The default value is ``False``.
128
125
  data_archive_dir : str (optional)
129
126
  DISDRODB Data Archive directory. Format: ``<...>/DISDRODB``.
@@ -167,7 +164,8 @@ def download_archive(
167
164
  force=force,
168
165
  )
169
166
  except Exception as e:
170
- print(f" - Download error: {e}")
167
+ msg = e.args[0] if e.args else str(e)
168
+ print(f" - Download error: {msg}")
171
169
  print(" ")
172
170
 
173
171
 
@@ -196,7 +194,7 @@ def download_station(
196
194
  The base directory of DISDRODB, expected in the format ``<...>/DISDRODB``.
197
195
  If not specified, the path specified in the DISDRODB active configuration will be used.
198
196
  force: bool, optional
199
- If ``True``, overwrite the already existing raw data file.
197
+ If ``True``, remove existing data and re-download.
200
198
  The default value is ``False``.
201
199
  data_archive_dir : str (optional)
202
200
  DISDRODB Data Archive directory. Format: ``<...>/DISDRODB``.
@@ -240,7 +238,7 @@ def check_consistent_station_name(metadata_filepath, station_name):
240
238
 
241
239
 
242
240
  def download_station_data(metadata_filepath: str, data_archive_dir: str, force: bool = False, verbose=True) -> None:
243
- """Download and unzip the station data .
241
+ """Download and unzip the station data.
244
242
 
245
243
  Parameters
246
244
  ----------
@@ -270,26 +268,34 @@ def download_station_data(metadata_filepath: str, data_archive_dir: str, force:
270
268
  product="RAW",
271
269
  )
272
270
  # Check DISDRODB data url
273
- disdrodb_data_url = metadata_dict.get("disdrodb_data_url", None)
271
+ disdrodb_data_url = metadata_dict.get("disdrodb_data_url", "")
272
+ if disdrodb_data_url == "":
273
+ raise ValueError(f"{campaign_name} {station_name} station data are not yet publicly available.")
274
274
  if not _is_valid_disdrodb_data_url(disdrodb_data_url):
275
275
  raise ValueError(f"Invalid disdrodb_data_url '{disdrodb_data_url}' for station {station_name}")
276
276
 
277
+ # Remove existing station directory if force=True
278
+ if force and os.path.exists(station_dir):
279
+ print(f" - Removing existing station data at {station_dir}.")
280
+ remove_file_or_directories(station_dir)
281
+
277
282
  # Download files
278
283
  # - Option 1: Download ZIP file containing all station raw data
279
- if disdrodb_data_url.startswith("https://zenodo.org/") or disdrodb_data_url.startswith("https://cloudnet.fmi.fi/"):
280
- download_zip_file(url=disdrodb_data_url, dst_dir=station_dir, force=force)
284
+ zip_repos = ["https://zenodo.org/", "https://cloudnet.fmi.fi/", "https://data.dtu.dk/"]
285
+ if any(disdrodb_data_url.startswith(repo) for repo in zip_repos):
286
+ download_zip_file(url=disdrodb_data_url, dst_dir=station_dir)
281
287
 
282
288
  # - Option 2: Recursive download from a web server via HTTP or HTTPS.
283
289
  elif disdrodb_data_url.startswith("http"):
284
- download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir, force=force, verbose=verbose)
290
+ download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
285
291
  # - Retry to be more sure that all data have been downloaded
286
- download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir, force=True, verbose=verbose)
292
+ download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
287
293
 
288
294
  # - Option 3: Recursive download from a ftp server
289
295
  elif disdrodb_data_url.startswith("ftp"):
290
- download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir, force=force, verbose=verbose)
296
+ download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
291
297
  # - Retry to be more sure that all data have been downloaded
292
- download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir, force=True, verbose=verbose)
298
+ download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
293
299
 
294
300
  else:
295
301
  raise NotImplementedError(f"Open a GitHub Issue to enable the download of data from {disdrodb_data_url}.")
@@ -299,7 +305,7 @@ def download_station_data(metadata_filepath: str, data_archive_dir: str, force:
299
305
  #### Download from Web Server via HTTP or HTTPS
300
306
 
301
307
 
302
- def download_web_server_data(url: str, dst_dir: str, force=True, verbose=True) -> None:
308
+ def download_web_server_data(url: str, dst_dir: str, verbose=True) -> None:
303
309
  """Download data from a web server via HTTP or HTTPS.
304
310
 
305
311
  Use the system's wget command to recursively download all files and subdirectories
@@ -317,9 +323,6 @@ def download_web_server_data(url: str, dst_dir: str, force=True, verbose=True) -
317
323
  HTTPS URL pointing to webserver folder. Example: "https://ruisdael.citg.tudelft.nl/parsivel/PAR001_Cabauw/"
318
324
  dst_dir : str
319
325
  Local directory where to download the file (DISDRODB station data directory).
320
- force : bool, optional
321
- If ``True``, re-download new/updated files (skip unchanged ones).
322
- If ``False``, keep existing files untouched.
323
326
  verbose : bool, optional
324
327
  Print wget output (default is True).
325
328
  """
@@ -336,7 +339,7 @@ def download_web_server_data(url: str, dst_dir: str, force=True, verbose=True) -
336
339
  os.makedirs(dst_dir, exist_ok=True)
337
340
 
338
341
  # 5. Build wget command
339
- cmd = build_webserver_wget_command(url, cut_dirs=cut_dirs, dst_dir=dst_dir, force=force, verbose=verbose)
342
+ cmd = build_webserver_wget_command(url, cut_dirs=cut_dirs, dst_dir=dst_dir, verbose=verbose)
340
343
 
341
344
  # 6. Run wget command
342
345
  try:
@@ -375,7 +378,7 @@ def compute_cut_dirs(url: str) -> int:
375
378
  return len(segments)
376
379
 
377
380
 
378
- def build_webserver_wget_command(url: str, cut_dirs: int, dst_dir: str, force: bool, verbose: bool) -> list[str]:
381
+ def build_webserver_wget_command(url: str, cut_dirs: int, dst_dir: str, verbose: bool) -> list[str]:
379
382
  """Construct the wget command list for subprocess.run.
380
383
 
381
384
  Notes
@@ -400,9 +403,9 @@ def build_webserver_wget_command(url: str, cut_dirs: int, dst_dir: str, force: b
400
403
  "--reject",
401
404
  "index.html*", # avoid to download Apache autoindex index.html
402
405
  f"--cut-dirs={cut_dirs}",
406
+ # Downloads just new data without re-downloading existing files
407
+ "--timestamping", # -N
403
408
  ]
404
- if force:
405
- cmd.append("--timestamping") # -N
406
409
 
407
410
  # Define source and destination directory
408
411
  cmd += [
@@ -421,7 +424,6 @@ def build_ftp_server_wget_command(
421
424
  url: str,
422
425
  cut_dirs: int,
423
426
  dst_dir: str,
424
- force: bool,
425
427
  verbose: bool,
426
428
  ) -> list[str]:
427
429
  """Construct the wget command list for FTP recursive download.
@@ -434,9 +436,6 @@ def build_ftp_server_wget_command(
434
436
  Number of leading path components to strip.
435
437
  dst_dir : str
436
438
  Local destination directory.
437
- force : bool
438
- If True, re-download newer files (--timestamping).
439
- If False, keep existing files untouched (--no-clobber).
440
439
  verbose : bool
441
440
  If False, suppress wget output (-q).
442
441
  """
@@ -450,14 +449,7 @@ def build_ftp_server_wget_command(
450
449
  "-np", # no parent --> don't ascend to higher-level dirs
451
450
  "-nH", # no host dirs --> avoid creating ftp.example.com/ locally
452
451
  f"--cut-dirs={cut_dirs}", # strip N leading path components
453
- ]
454
-
455
- if force:
456
- cmd.append("--timestamping") # download if remote file is newer
457
- else:
458
- cmd.append("--no-clobber") # skip files that already exist
459
-
460
- cmd += [
452
+ "--timestamping", # download if remote file is newer
461
453
  "-P", # specify local destination directory
462
454
  dst_dir,
463
455
  f"ftp://anonymous:disdrodb@{url}", # target FTP URL
@@ -465,7 +457,7 @@ def build_ftp_server_wget_command(
465
457
  return cmd
466
458
 
467
459
 
468
- def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbose: bool = True) -> None:
460
+ def download_ftp_server_data(url: str, dst_dir: str, verbose: bool = True) -> None:
469
461
  """Download data from an FTP server with anonymous login.
470
462
 
471
463
  Parameters
@@ -474,9 +466,6 @@ def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbos
474
466
  FTP server URL pointing to a folder. Example: "ftp://ftp.example.com/path/to/data/"
475
467
  dst_dir : str
476
468
  Local directory where to download the file (DISDRODB station data directory).
477
- force : bool, optional
478
- If ``True``, re-download new/updated files (skip unchanged ones).
479
- If ``False``, keep existing files untouched.
480
469
  verbose : bool, optional
481
470
  Print wget output (default is True).
482
471
  """
@@ -496,7 +485,6 @@ def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbos
496
485
  url,
497
486
  cut_dirs=cut_dirs,
498
487
  dst_dir=dst_dir,
499
- force=force,
500
488
  verbose=verbose,
501
489
  )
502
490
  # Run wget
@@ -515,15 +503,15 @@ def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbos
515
503
  #### Download from Zenodo
516
504
 
517
505
 
518
- def download_zip_file(url, dst_dir, force):
506
+ def download_zip_file(url, dst_dir):
519
507
  """Download zip file from zenodo and extract station raw data."""
520
508
  # Download zip file
521
- zip_filepath = _download_file_from_url(url, dst_dir=dst_dir, force=force)
509
+ zip_filepath = _download_file_from_url(url, dst_dir=dst_dir)
522
510
  # Extract the stations files from the downloaded station.zip file
523
511
  _extract_station_files(zip_filepath, station_dir=dst_dir)
524
512
 
525
513
 
526
- def _download_file_from_url(url: str, dst_dir: str, force: bool = False) -> str:
514
+ def _download_file_from_url(url: str, dst_dir: str) -> str:
527
515
  """Download station zip file into the DISDRODB station data directory.
528
516
 
529
517
  Parameters
@@ -532,8 +520,6 @@ def _download_file_from_url(url: str, dst_dir: str, force: bool = False) -> str:
532
520
  URL of the file to download.
533
521
  dst_dir : str
534
522
  Local directory where to download the file (DISDRODB station data directory).
535
- force : bool, optional
536
- Overwrite the raw data file if already existing. The default value is ``False``.
537
523
 
538
524
  Returns
539
525
  -------
@@ -544,16 +530,14 @@ def _download_file_from_url(url: str, dst_dir: str, force: bool = False) -> str:
544
530
  """
545
531
  dst_filename = os.path.basename(dst_dir) + ".zip"
546
532
  dst_filepath = os.path.join(dst_dir, dst_filename)
533
+ # Ensure destination directory exists and is empty
547
534
  os.makedirs(dst_dir, exist_ok=True)
548
535
  if not is_empty_directory(dst_dir):
549
- if force:
550
- shutil.rmtree(dst_dir)
551
- os.makedirs(dst_dir) # station directory
552
- else:
553
- raise ValueError(
554
- f"There are already raw files within the DISDRODB Data Archive at {dst_dir}. Download is suspended. "
555
- "Use force=True to force the download and overwrite existing raw files.",
556
- )
536
+ raise ValueError(
537
+ "ZIP archive download is aborted."
538
+ f"There are already raw files within the DISDRODB Data Archive at {dst_dir}."
539
+ "Use force=True if you wish to remove existing files and redownload the station archive.",
540
+ )
557
541
 
558
542
  os.makedirs(dst_dir, exist_ok=True)
559
543
 
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
disdrodb/docs.py CHANGED
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -67,6 +67,36 @@ sample_interval:
67
67
  long_name: Sampling interval
68
68
  description: Sampling interval in seconds.
69
69
  unit: s
70
+ n_particles:
71
+ long_name: "number of particles"
72
+ standard_name: "number_of_particles"
73
+ units: "1"
74
+ description: "Total count of hydrometeor particles."
75
+ valid_min: 0
76
+ n_low_density_graupel:
77
+ long_name: "number of low-density graupel particles"
78
+ standard_name: "number_of_graupel_particles"
79
+ units: "1"
80
+ description: "Count of low-density (<400 kg/m3) graupel particles."
81
+ valid_min: 0
82
+ n_high_density_graupel:
83
+ long_name: "number of high-density graupel particles"
84
+ standard_name: "number_of_graupel_particles"
85
+ units: "1"
86
+ description: "Count of high-density (>400 kg/m3) graupel particles."
87
+ valid_min: 0
88
+ n_small_hail:
89
+ long_name: "number of small hail particles"
90
+ standard_name: "number_of_small_hail_particles"
91
+ units: "1"
92
+ description: "Count of hail particles smaller than 8 mm in diameter."
93
+ valid_min: 0
94
+ n_large_hail:
95
+ long_name: "number of large hail particles"
96
+ standard_name: "number_of_large_hail_particles"
97
+ units: "1"
98
+ description: "Count of hail particles larger than 8 mm in diameter."
99
+ valid_min: 0
70
100
  drop_number:
71
101
  description: Counts of drops per diameter and velocity class
72
102
  long_name: Drop counts per diameter and velocity class
@@ -259,8 +289,12 @@ RHOHV:
259
289
  reflectivity
260
290
  long_name: Copolarized Correlation Coefficient
261
291
  units: ""
262
- LDR:
263
- description: Linear depolarization ratio
292
+ LDRH:
293
+ description: Linear depolarization ratio at horizontal polarization
294
+ long_name: Linear Depolarization Ratio
295
+ units: dB
296
+ LDRV:
297
+ description: Linear depolarization ratio at vertical polarization
264
298
  long_name: Linear Depolarization Ratio
265
299
  units: dB
266
300
  KDP:
@@ -337,3 +371,19 @@ KLDiv:
337
371
  description: A distance measure of how the modelled distribution diverges from the observed N(D) one.
338
372
  units: ""
339
373
  valid_range: [0, inf]
374
+ air_temperature:
375
+ description: "Air temperature in degrees Celsius (C)"
376
+ long_name: Air temperature
377
+ units: "degC"
378
+ relative_humidity:
379
+ description: "Relative humidity in percent (%)"
380
+ long_name: Relative humidity
381
+ units: "%"
382
+ wind_speed:
383
+ description: "Wind speed in m/s"
384
+ long_name: Wind speed
385
+ units: "m/s"
386
+ wind_direction:
387
+ description: "Wind direction in degrees (0-360)"
388
+ long_name: Wind direction
389
+ units: "degrees"
@@ -373,7 +373,14 @@ DELTAHV:
373
373
  shuffle: true
374
374
  fletcher32: false
375
375
  contiguous: false
376
- LDR:
376
+ LDRH:
377
+ dtype: float32
378
+ zlib: true
379
+ complevel: 3
380
+ shuffle: true
381
+ fletcher32: false
382
+ contiguous: false
383
+ LDRV:
377
384
  dtype: float32
378
385
  zlib: true
379
386
  complevel: 3
@@ -471,3 +478,40 @@ KLDiv:
471
478
  shuffle: true
472
479
  fletcher32: false
473
480
  contiguous: false
481
+ air_temperature:
482
+ dtype: uint16
483
+ scale_factor: 0.1
484
+ add_offset: -99.9
485
+ zlib: true
486
+ complevel: 3
487
+ shuffle: true
488
+ fletcher32: false
489
+ contiguous: false
490
+ _FillValue: 65535
491
+ relative_humidity:
492
+ dtype: uint16
493
+ scale_factor: 0.01
494
+ zlib: true
495
+ complevel: 3
496
+ shuffle: true
497
+ fletcher32: false
498
+ contiguous: false
499
+ _FillValue: 65535
500
+ wind_speed:
501
+ dtype: uint16
502
+ scale_factor: 0.1
503
+ add_offset: -99.9
504
+ zlib: true
505
+ complevel: 3
506
+ shuffle: true
507
+ fletcher32: false
508
+ contiguous: false
509
+ _FillValue: 65535
510
+ wind_direction:
511
+ dtype: uint16
512
+ zlib: true
513
+ complevel: 3
514
+ shuffle: true
515
+ fletcher32: false
516
+ contiguous: false
517
+ _FillValue: 65535
@@ -0,0 +1,5 @@
1
+ archive_options:
2
+ strategy: time_block
3
+ strategy_options:
4
+ freq: month
5
+ folder_partitioning: "year"
@@ -0,0 +1,5 @@
1
+ archive_options:
2
+ strategy: time_block
3
+ strategy_options:
4
+ freq: day
5
+ folder_partitioning: "year"
@@ -0,0 +1,6 @@
1
+ temporal_resolutions: ["1MIN", "5MIN", "10MIN", "ROLL1MIN"]
2
+ archive_options:
3
+ strategy: time_block
4
+ strategy_options:
5
+ freq: month
6
+ folder_partitioning: "year"
@@ -1,19 +1,6 @@
1
- temporal_resolutions: ["1MIN", "5MIN", "10MIN", "ROLL1MIN", "5MIN"]
1
+ temporal_resolutions: ["1MIN", "5MIN", "10MIN", "ROLL1MIN"]
2
2
  archive_options:
3
3
  strategy: time_block
4
4
  strategy_options:
5
5
  freq: day
6
6
  folder_partitioning: "year"
7
- product_options:
8
- fall_velocity_model: "Beard1976"
9
- minimum_diameter: 0
10
- maximum_diameter: 10
11
- minimum_velocity: 0
12
- maximum_velocity: 12
13
- above_velocity_fraction: 0.5
14
- above_velocity_tolerance: null
15
- below_velocity_fraction: 0.5
16
- below_velocity_tolerance: null
17
- small_diameter_threshold: 1
18
- small_velocity_threshold: 2.5
19
- maintain_smallest_drops: True
@@ -0,0 +1 @@
1
+ radar_enabled: True
@@ -0,0 +1,36 @@
1
+ temporal_resolutions: ["1MIN", "5MIN", "10MIN"]
2
+ archive_options:
3
+ strategy: time_block
4
+ strategy_options:
5
+ freq: month
6
+ folder_partitioning: ""
7
+ product_options:
8
+ compute_spectra: False
9
+ compute_percentage_contribution: False
10
+ minimum_ndrops: 1
11
+ minimum_nbins: 1
12
+ minimum_rain_rate: 0.01
13
+ fall_velocity_model: "Beard1976"
14
+ minimum_diameter: 0.375
15
+ maximum_diameter: 10
16
+ minimum_velocity: 0
17
+ maximum_velocity: 12
18
+ keep_mixed_precipitation: False
19
+ above_velocity_fraction: null
20
+ above_velocity_tolerance: 3
21
+ below_velocity_fraction: null
22
+ below_velocity_tolerance: 3
23
+ maintain_drops_smaller_than: 1
24
+ maintain_drops_slower_than: 2.5
25
+ maintain_smallest_drops: True
26
+ remove_splashing_drops: True
27
+ radar_enabled: False
28
+ radar_options:
29
+ frequency: ["S", "C", "X", "Ku", "K", "Ka", "W"]
30
+ num_points: 1024
31
+ diameter_max: 10
32
+ canting_angle_std: 7
33
+ axis_ratio_model: Thurai2007
34
+ permittivity_model: Turner2016
35
+ water_temperature: 10
36
+ elevation_angle: 0
@@ -0,0 +1 @@
1
+ radar_enabled: True