disdrodb 0.2.1__py3-none-any.whl → 0.4.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 (313) hide show
  1. disdrodb/__init__.py +3 -1
  2. disdrodb/_config.py +2 -3
  3. disdrodb/_version.py +2 -2
  4. disdrodb/accessor/__init__.py +2 -1
  5. disdrodb/accessor/methods.py +10 -9
  6. disdrodb/api/checks.py +3 -7
  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 +233 -32
  11. disdrodb/api/path.py +3 -7
  12. disdrodb/cli/disdrodb_check_metadata_archive.py +3 -2
  13. disdrodb/cli/disdrodb_check_products_options.py +45 -0
  14. disdrodb/cli/disdrodb_create_summary.py +54 -28
  15. disdrodb/cli/disdrodb_create_summary_station.py +41 -20
  16. disdrodb/cli/disdrodb_data_archive_directory.py +2 -3
  17. disdrodb/cli/disdrodb_download_archive.py +50 -30
  18. disdrodb/cli/disdrodb_download_metadata_archive.py +28 -16
  19. disdrodb/cli/disdrodb_download_station.py +58 -29
  20. disdrodb/cli/disdrodb_initialize_station.py +43 -23
  21. disdrodb/cli/disdrodb_metadata_archive_directory.py +2 -3
  22. disdrodb/cli/disdrodb_open_data_archive.py +17 -13
  23. disdrodb/cli/disdrodb_open_logs_directory.py +31 -21
  24. disdrodb/cli/disdrodb_open_metadata_archive.py +26 -13
  25. disdrodb/cli/disdrodb_open_metadata_directory.py +34 -23
  26. disdrodb/cli/disdrodb_open_product_directory.py +39 -23
  27. disdrodb/cli/disdrodb_open_readers_directory.py +2 -3
  28. disdrodb/cli/disdrodb_run.py +189 -0
  29. disdrodb/cli/disdrodb_run_l0.py +61 -70
  30. disdrodb/cli/disdrodb_run_l0_station.py +50 -55
  31. disdrodb/cli/disdrodb_run_l0a.py +53 -51
  32. disdrodb/cli/disdrodb_run_l0a_station.py +41 -40
  33. disdrodb/cli/disdrodb_run_l0b.py +51 -51
  34. disdrodb/cli/disdrodb_run_l0b_station.py +40 -39
  35. disdrodb/cli/disdrodb_run_l0c.py +56 -53
  36. disdrodb/cli/disdrodb_run_l0c_station.py +44 -41
  37. disdrodb/cli/disdrodb_run_l1.py +55 -51
  38. disdrodb/cli/disdrodb_run_l1_station.py +43 -40
  39. disdrodb/cli/disdrodb_run_l2e.py +56 -51
  40. disdrodb/cli/disdrodb_run_l2e_station.py +44 -40
  41. disdrodb/cli/disdrodb_run_l2m.py +55 -51
  42. disdrodb/cli/disdrodb_run_l2m_station.py +43 -40
  43. disdrodb/cli/disdrodb_run_station.py +184 -0
  44. disdrodb/cli/disdrodb_upload_archive.py +51 -42
  45. disdrodb/cli/disdrodb_upload_station.py +42 -36
  46. disdrodb/configs.py +20 -16
  47. disdrodb/constants.py +5 -2
  48. disdrodb/data_transfer/__init__.py +1 -3
  49. disdrodb/data_transfer/download_data.py +45 -61
  50. disdrodb/data_transfer/upload_data.py +7 -11
  51. disdrodb/data_transfer/zenodo.py +2 -4
  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 +0 -13
  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 +16 -2
  74. disdrodb/fall_velocity/__init__.py +47 -0
  75. disdrodb/fall_velocity/graupel.py +484 -0
  76. disdrodb/fall_velocity/hail.py +288 -0
  77. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -44
  78. disdrodb/issue/__init__.py +1 -3
  79. disdrodb/issue/checks.py +2 -3
  80. disdrodb/issue/reader.py +2 -3
  81. disdrodb/issue/writer.py +2 -5
  82. disdrodb/l0/__init__.py +2 -1
  83. disdrodb/l0/check_configs.py +36 -29
  84. disdrodb/l0/check_standards.py +1 -4
  85. disdrodb/l0/configs/LPM/l0a_encodings.yml +17 -17
  86. disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +55 -55
  87. disdrodb/l0/configs/LPM/l0b_encodings.yml +17 -17
  88. disdrodb/l0/configs/LPM/raw_data_format.yml +17 -17
  89. disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +2 -2
  90. disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +2 -2
  91. disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +2 -2
  92. disdrodb/l0/configs/LPM_V0/raw_data_format.yml +2 -2
  93. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  94. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  95. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  96. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  97. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  98. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  99. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  100. disdrodb/l0/l0_reader.py +2 -3
  101. disdrodb/l0/l0a_processing.py +6 -8
  102. disdrodb/l0/l0b_nc_processing.py +3 -6
  103. disdrodb/l0/l0b_processing.py +2 -16
  104. disdrodb/l0/l0c_processing.py +29 -12
  105. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +2 -1
  106. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +18 -18
  107. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +18 -18
  108. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +18 -18
  109. disdrodb/l0/readers/LPM/GERMANY/DWD.py +244 -63
  110. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +65 -23
  111. disdrodb/l0/readers/LPM/ITALY/GID_LPM_AQ.py +277 -0
  112. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +19 -18
  113. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +23 -19
  114. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +19 -21
  115. disdrodb/l0/readers/LPM/KIT/CHWALA.py +19 -20
  116. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  117. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +18 -18
  118. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +19 -20
  119. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +19 -20
  120. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +19 -20
  121. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +19 -20
  122. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +19 -20
  123. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  124. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +19 -20
  125. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +19 -20
  126. disdrodb/l0/readers/LPM/USA/DEVEX.py +255 -0
  127. disdrodb/l0/readers/LPM_V0/BELGIUM/ULIEGE.py +3 -5
  128. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +4 -3
  129. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +124 -0
  130. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  131. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +2 -1
  132. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +2 -3
  133. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +2 -1
  134. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +2 -1
  135. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +2 -1
  136. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +2 -1
  137. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +2 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +2 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +2 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +2 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +2 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +2 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +2 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +2 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +2 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +2 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +2 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +2 -1
  151. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +2 -1
  152. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +2 -1
  154. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +2 -1
  155. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +2 -1
  156. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +2 -1
  157. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +2 -1
  158. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +2 -1
  159. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  160. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  161. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  164. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  165. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  166. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  167. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  169. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  170. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +2 -1
  171. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +2 -1
  172. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -1
  173. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +2 -3
  174. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  175. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  176. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  177. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  178. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +2 -1
  179. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +2 -1
  180. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  181. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +2 -3
  182. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +2 -2
  183. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  184. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  185. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  186. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +6 -3
  187. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +1 -1
  188. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  189. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  190. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  191. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_UCLM.py +126 -0
  192. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +2 -1
  193. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +1 -1
  195. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +3 -1
  196. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +2 -1
  198. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  199. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  200. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +2 -1
  201. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +2 -1
  202. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  204. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +2 -3
  206. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  207. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +2 -1
  208. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  209. disdrodb/l0/readers/PARSIVEL2/NORWAY/UIB.py +10 -2
  210. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +2 -3
  211. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  212. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  213. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +2 -3
  214. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  215. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +2 -1
  216. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +1 -1
  217. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +2 -1
  218. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +2 -3
  219. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +2 -3
  220. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +2 -1
  221. disdrodb/l0/readers/RD80/BRAZIL/ATTO_RD80.py +1 -3
  222. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  223. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  224. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  225. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  226. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +2 -3
  227. disdrodb/l0/readers/SWS250/BELGIUM/KMI.py +2 -3
  228. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +2 -3
  229. disdrodb/l0/readers/template_reader_raw_text_data.py +2 -3
  230. disdrodb/l0/standards.py +4 -5
  231. disdrodb/l0/template_tools.py +7 -11
  232. disdrodb/l1/__init__.py +2 -1
  233. disdrodb/l1/classification.py +914 -0
  234. disdrodb/l1/processing.py +36 -106
  235. disdrodb/l1/resampling.py +13 -3
  236. disdrodb/l1_env/__init__.py +1 -1
  237. disdrodb/l1_env/routines.py +7 -6
  238. disdrodb/l2/__init__.py +2 -1
  239. disdrodb/l2/empirical_dsd.py +58 -31
  240. disdrodb/l2/processing.py +327 -61
  241. disdrodb/metadata/checks.py +10 -13
  242. disdrodb/metadata/download.py +5 -4
  243. disdrodb/metadata/geolocation.py +3 -4
  244. disdrodb/metadata/info.py +3 -5
  245. disdrodb/metadata/manipulation.py +1 -3
  246. disdrodb/metadata/reader.py +1 -3
  247. disdrodb/metadata/search.py +1 -4
  248. disdrodb/metadata/standards.py +1 -3
  249. disdrodb/metadata/writer.py +1 -3
  250. disdrodb/physics/__init__.py +17 -0
  251. disdrodb/physics/atmosphere.py +273 -0
  252. disdrodb/physics/water.py +131 -0
  253. disdrodb/physics/wrappers.py +63 -0
  254. disdrodb/psd/__init__.py +1 -2
  255. disdrodb/psd/fitting.py +23 -9
  256. disdrodb/psd/models.py +2 -1
  257. disdrodb/routines/__init__.py +6 -1
  258. disdrodb/routines/l0.py +39 -25
  259. disdrodb/routines/l1.py +23 -16
  260. disdrodb/routines/l2.py +12 -9
  261. disdrodb/routines/options.py +117 -73
  262. disdrodb/routines/options_validation.py +728 -0
  263. disdrodb/routines/wrappers.py +460 -40
  264. disdrodb/scattering/__init__.py +1 -2
  265. disdrodb/scattering/axis_ratio.py +6 -6
  266. disdrodb/scattering/permittivity.py +9 -8
  267. disdrodb/scattering/routines.py +33 -15
  268. disdrodb/summary/__init__.py +1 -1
  269. disdrodb/summary/routines.py +95 -30
  270. disdrodb/utils/__init__.py +1 -1
  271. disdrodb/utils/archiving.py +18 -10
  272. disdrodb/utils/attrs.py +7 -5
  273. disdrodb/utils/cli.py +8 -10
  274. disdrodb/utils/compression.py +10 -13
  275. disdrodb/utils/coords.py +45 -0
  276. disdrodb/utils/dask.py +7 -5
  277. disdrodb/utils/dataframe.py +5 -6
  278. disdrodb/utils/decorators.py +3 -4
  279. disdrodb/utils/dict.py +1 -1
  280. disdrodb/utils/directories.py +5 -7
  281. disdrodb/utils/encoding.py +4 -5
  282. disdrodb/utils/event.py +1 -1
  283. disdrodb/utils/list.py +1 -3
  284. disdrodb/utils/logger.py +1 -3
  285. disdrodb/utils/manipulations.py +175 -4
  286. disdrodb/utils/pydantic.py +81 -0
  287. disdrodb/utils/routines.py +2 -3
  288. disdrodb/utils/subsetting.py +1 -1
  289. disdrodb/utils/time.py +6 -4
  290. disdrodb/utils/warnings.py +2 -3
  291. disdrodb/utils/writer.py +5 -3
  292. disdrodb/utils/xarray.py +31 -3
  293. disdrodb/utils/yaml.py +1 -3
  294. disdrodb/viz/__init__.py +1 -1
  295. disdrodb/viz/plots.py +193 -18
  296. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/METADATA +5 -4
  297. disdrodb-0.4.0.dist-info/RECORD +361 -0
  298. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/entry_points.txt +3 -0
  299. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  300. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  301. disdrodb/etc/products/L1/LPM_V0/1MIN.yaml +0 -13
  302. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  303. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  304. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  305. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  306. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  307. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  308. disdrodb/l1/beard_model.py +0 -662
  309. disdrodb/l1/filters.py +0 -205
  310. disdrodb-0.2.1.dist-info/RECORD +0 -329
  311. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/WHEEL +0 -0
  312. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/licenses/LICENSE +0 -0
  313. {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,184 @@
1
+ # -----------------------------------------------------------------------------.
2
+ # Copyright (c) 2021-2026 DISDRODB developers
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
+ # -----------------------------------------------------------------------------.
17
+ """Script to launch all DISDRODB products generation for a given station."""
18
+
19
+ import sys
20
+
21
+ import click
22
+
23
+ from disdrodb.utils.cli import (
24
+ click_data_archive_dir_option,
25
+ click_l0_archive_options,
26
+ click_metadata_archive_dir_option,
27
+ click_processing_options,
28
+ click_station_arguments,
29
+ parse_archive_dir,
30
+ )
31
+
32
+ sys.tracebacklimit = 0 # avoid full traceback error if occur
33
+
34
+
35
+ # -------------------------------------------------------------------------.
36
+ # Click Command Line Interface decorator
37
+ @click.command()
38
+ @click_station_arguments
39
+ @click_processing_options
40
+ @click_l0_archive_options
41
+ @click.option(
42
+ "-l1",
43
+ "--l1_processing",
44
+ type=bool,
45
+ show_default=True,
46
+ default=True,
47
+ help="Run L1 processing",
48
+ )
49
+ @click.option(
50
+ "-l2e",
51
+ "--l2e_processing",
52
+ type=bool,
53
+ show_default=True,
54
+ default=True,
55
+ help="Run L2E processing",
56
+ )
57
+ @click.option(
58
+ "-l2m",
59
+ "--l2m_processing",
60
+ type=bool,
61
+ show_default=True,
62
+ default=True,
63
+ help="Run L2M processing.",
64
+ )
65
+ @click_data_archive_dir_option
66
+ @click_metadata_archive_dir_option
67
+ def disdrodb_run_station(
68
+ # Station arguments
69
+ data_source: str,
70
+ campaign_name: str,
71
+ station_name: str,
72
+ # L0 archive options
73
+ l0a_processing: bool = True,
74
+ l0b_processing: bool = True,
75
+ l0c_processing: bool = True,
76
+ remove_l0a: bool = False,
77
+ remove_l0b: bool = False,
78
+ # Higher level processing options
79
+ l1_processing: bool = True,
80
+ l2e_processing: bool = True,
81
+ l2m_processing: bool = True,
82
+ # Processing options
83
+ force: bool = False,
84
+ verbose: bool = True,
85
+ parallel: bool = True,
86
+ debugging_mode: bool = False,
87
+ # DISDRODB root directories
88
+ data_archive_dir: str | None = None,
89
+ metadata_archive_dir: str | None = None,
90
+ ):
91
+ """Run the complete processing of a specific DISDRODB station.
92
+
93
+ This function processes a single station through the complete DISDRODB processing
94
+ chain, from raw data ingestion to final derived products. All processing levels
95
+ are executed in sequence for the specified station.
96
+
97
+ \b
98
+ Processing Levels:
99
+ L0A: Raw data converted to DISDRODB standardized Apache Parquet format
100
+ L0B: L0A data converted to DISDRODB standardized netCDF4 format
101
+ L0C: Apply time QC and consolidate L0B data into (by default daily) netCDF files
102
+ L1: Temporally resample L0C data to standard intervals (1-60 minutes), apply QC algorithms
103
+ and determine precipitation phase and hydrometeors types
104
+ L2E: Compute empirical integral DSD variables (e.g., rain rate, liquid water content)
105
+ L2M: Fit parametric DSD models and compute model-based integral DSD variables
106
+
107
+ \b
108
+ Station Specification:
109
+ Requires exact specification of data_source, campaign_name, and station_name.
110
+ All three parameters must be provided and are case-sensitive (UPPER CASE required).
111
+
112
+ \b
113
+ Performance Options:
114
+ --parallel: Uses multiple processes for faster processing (default: True)
115
+ If parallel processing is enabled, each process will use a single thread
116
+ to avoid issues with the HDF/netCDF library.
117
+ The DASK_NUM_WORKERS environment variable controls the number of processes
118
+ to use.A sensible default is automatically set by the software.
119
+ --debugging_mode: Processes only a subset of data for testing
120
+ --force: Overwrites existing output files (default: False)
121
+
122
+
123
+ \b
124
+ Examples:
125
+ # Process a single station with full processing chain
126
+ disdrodb_run_station EPFL HYMEX_LTE_SOP2 10
127
+
128
+ # Process station, skip L0A processing (start from existing L0B data)
129
+ disdrodb_run_station NASA IFLOODS apu01 --l0a_processing False
130
+
131
+ # Process station with debugging mode and custom workers
132
+ DASK_NUM_WORKERS=4 disdrodb_run_station NETHERLANDS DELFT PAR001_Cabauw --debugging_mode True
133
+
134
+ # Process station, skip final L2M level
135
+ disdrodb_run_station FRANCE ENPC_CARNOT Carnot_Pars1 --l2m_processing False
136
+
137
+ # Force overwrite existing files with verbose output
138
+ disdrodb_run_station EPFL HYMEX_2012 10 --force True --verbose True
139
+
140
+ \b
141
+ Data Management:
142
+ --remove_l0a: Delete L0A files after L0B processing (saves disk space)
143
+ --remove_l0b: Delete L0B files after L0C processing (saves disk space)
144
+ Use with caution - removed files cannot be recovered without reprocessing
145
+
146
+ \b
147
+ Important Notes:
148
+ - Data source, campaign, and station names must be UPPER CASE
149
+ - All three station identifiers are required (no wildcards or filtering)
150
+ - Processing chain: L0A → L0B → L0C → L1 → L2E → L2M
151
+ - You can skip early or late processing levels, but not intermediate ones
152
+ - Processing validates chain consistency and will raise errors for gaps
153
+ - Station-specific processing may require significant time for large datasets
154
+ - Use --debugging_mode for initial testing with reduced data volumes
155
+ """ # noqa: D301
156
+ from disdrodb.routines import run_station
157
+
158
+ data_archive_dir = parse_archive_dir(data_archive_dir)
159
+ metadata_archive_dir = parse_archive_dir(metadata_archive_dir)
160
+
161
+ run_station(
162
+ # DISDRODB root directories
163
+ data_archive_dir=data_archive_dir,
164
+ metadata_archive_dir=metadata_archive_dir,
165
+ # Station arguments
166
+ data_source=data_source,
167
+ campaign_name=campaign_name,
168
+ station_name=station_name,
169
+ # L0 archive options
170
+ l0a_processing=l0a_processing,
171
+ l0b_processing=l0b_processing,
172
+ l0c_processing=l0c_processing,
173
+ remove_l0a=remove_l0a,
174
+ remove_l0b=remove_l0b,
175
+ # Higher level processing options
176
+ l1_processing=l1_processing,
177
+ l2e_processing=l2e_processing,
178
+ l2m_processing=l2m_processing,
179
+ # Processing options
180
+ force=force,
181
+ verbose=verbose,
182
+ debugging_mode=debugging_mode,
183
+ parallel=parallel,
184
+ )
@@ -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
@@ -19,7 +17,6 @@
19
17
  """Routines to upload data to the DISDRODB Decentralized Data Archive."""
20
18
 
21
19
  import sys
22
- from typing import Optional
23
20
 
24
21
  import click
25
22
 
@@ -41,48 +38,60 @@ sys.tracebacklimit = 0 # avoid full traceback error if occur
41
38
  @click_metadata_archive_dir_option
42
39
  def disdrodb_upload_archive(
43
40
  # DISDRODB root directories
44
- data_archive_dir: Optional[str] = None,
45
- metadata_archive_dir: Optional[str] = None,
41
+ data_archive_dir: str | None = None,
42
+ metadata_archive_dir: str | None = None,
46
43
  # Stations options
47
- data_sources: Optional[str] = None,
48
- campaign_names: Optional[str] = None,
49
- station_names: Optional[str] = None,
44
+ data_sources: str | None = None,
45
+ campaign_names: str | None = None,
46
+ station_names: str | None = None,
50
47
  # Upload options
51
- platform: Optional[str] = None,
48
+ platform: str | None = None,
52
49
  force: bool = False,
53
50
  ):
54
- """Find all stations containing local data and upload them to a remote repository.
55
-
56
- Parameters
57
- ----------
58
- platform: str, optional
59
- Name of the remote platform.
60
- The default platform is ``"sandbox.zenodo"`` (for testing purposes).
61
- Switch to ``"zenodo"`` for final data dissemination.
62
- force: bool, optional
63
- If ``True``, upload even if data already exists on another remote location.
64
- The default value is ``force=False``.
65
- data_archive_dir : str (optional)
66
- The directory path where the DISDRODB Data Archive is located.
67
- The directory path must end with ``<...>/DISDRODB``.
68
- If ``None``, it uses the ``data_archive_dir`` path specified
69
- in the DISDRODB active configuration.
70
-
71
- Other Parameters
72
- ----------------
73
- data_sources: str or list of str, optional
74
- Data source name (eg: EPFL).
75
- If not provided (``None``), all data sources will be uploaded.
76
- The default value is ``data_source=None``.
77
- campaign_names: str or list of str, optional
78
- Campaign name (eg: EPFL_ROOF_2012).
79
- If not provided (``None``), all campaigns will be uploaded.
80
- The default value is ``campaign_name=None``.
81
- station_names: str or list of str, optional
82
- Station name.
83
- If not provided (``None``), all stations will be uploaded.
84
- The default value is ``station_name=None``.
85
- """
51
+ """Upload raw data for multiple DISDRODB stations to the DISDRODB Decentralized Data Archive.
52
+
53
+ Currently, only upload to the Zenodo data repository is implemented.
54
+ The station metadata files are automatically updated with the remote data URL.
55
+
56
+ PLEASE UPLOAD JUST YOUR DATA !
57
+
58
+ \b
59
+ Station Selection:
60
+ If no station filters are specified, uploads ALL stations with local data.
61
+ Use data_sources, campaign_names, and station_names to filter stations.
62
+ Filters work together to narrow down the selection (AND logic).
63
+ Only stations with local raw data files will be uploaded.
64
+
65
+ \b
66
+ Upload Behavior:
67
+ By default, upload is skipped if data already exists on a remote location.
68
+ Use '--force True' to upload even if data already exists remotely.
69
+ Warning: Forcing upload may create duplicate versions on the remote platform.
70
+
71
+ \b
72
+ Upload Options:
73
+ --platform: Remote platform name (default: 'sandbox.zenodo' for testing)
74
+ Use 'zenodo' for final data dissemination.
75
+ --force: Upload even if data already exists remotely (default: False)
76
+
77
+ \b
78
+ Archive Directories:
79
+ --data_archive_dir: Custom path to DISDRODB data archive
80
+ --metadata_archive_dir: Custom path to DISDRODB metadata archive
81
+ If not specified, paths from the active DISDRODB configuration are used
82
+
83
+ \b
84
+ Examples:
85
+
86
+ # Upload a specific data sources to Zenodo Sandbox
87
+ disdrodb_upload_archive --data_sources 'YOUR_DATA_SOURCE' --platform sandbox.zenodo
88
+
89
+ # Upload a specific data sources to Zenodo and force upload
90
+ disdrodb_upload_archive --data_sources 'YOUR_DATA_SOURCE' --platform zenodo --force True
91
+
92
+ # Upload specific campaigns to Zenodo
93
+ disdrodb_upload_archive --campaign_names 'HYMEX_LTE_SOP2 IFLOODS' --platform zenodo
94
+ """ # noqa: D301
86
95
  from disdrodb.data_transfer.upload_data import upload_archive
87
96
 
88
97
  data_archive_dir = parse_archive_dir(data_archive_dir)
@@ -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
@@ -19,7 +17,6 @@
19
17
  """Routines to upload station data to the DISDRODB Decentralized Data Archive."""
20
18
 
21
19
  import sys
22
- from typing import Optional
23
20
 
24
21
  import click
25
22
 
@@ -45,41 +42,50 @@ def disdrodb_upload_station(
45
42
  campaign_name: str,
46
43
  station_name: str,
47
44
  # Upload options
48
- platform: Optional[str] = None,
45
+ platform: str | None = None,
49
46
  force: bool = False,
50
47
  # DISDRODB root directories
51
- data_archive_dir: Optional[str] = None,
52
- metadata_archive_dir: Optional[str] = None,
48
+ data_archive_dir: str | None = None,
49
+ metadata_archive_dir: str | None = None,
53
50
  ):
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
- """
51
+ """Upload raw data from a single DISDRODB station to the DISDRODB Decentralized Data Archive.
52
+
53
+ Currently, only upload to the Zenodo data repository is implemented.
54
+
55
+ The station metadata file is automatically updated with the remote data URL.
56
+
57
+ PLEASE UPLOAD JUST YOUR DATA !
58
+
59
+
60
+ \b
61
+ Upload Behavior:
62
+ By default, upload is skipped if data already exists on a remote location.
63
+ Use '--force True' to upload even if data already exists remotely.
64
+ Warning: Forcing upload will overwrite the existing disdrodb_data_url in metadata.
65
+
66
+ \b
67
+ Upload Options:
68
+ --platform: Remote platform name (default: 'sandbox.zenodo' for testing)
69
+ Use 'zenodo' for final data dissemination
70
+ --force: Upload even if data already exists remotely (default: False)
71
+
72
+ \b
73
+ Archive Directories:
74
+ --data_archive_dir: Custom path to DISDRODB data archive
75
+ --metadata_archive_dir: Custom path to DISDRODB metadata archive
76
+ If not specified, paths from the active DISDRODB configuration are used
77
+
78
+ \b
79
+ Examples:
80
+ # Upload a station to sandbox for testing
81
+ disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME
82
+
83
+ # Upload a station to production Zenodo
84
+ disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME --platform zenodo
85
+
86
+ # Force upload and update metadata URL
87
+ disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME --force True
88
+ """ # noqa: D301
83
89
  from disdrodb.data_transfer.upload_data import upload_station
84
90
 
85
91
  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
@@ -20,7 +18,6 @@
20
18
 
21
19
  import os
22
20
  import shutil
23
- from typing import Optional
24
21
 
25
22
  from disdrodb.utils.yaml import read_yaml, write_yaml
26
23
 
@@ -34,13 +31,13 @@ def _define_config_filepath():
34
31
 
35
32
 
36
33
  def define_configs(
37
- data_archive_dir: Optional[str] = None,
38
- metadata_archive_dir: Optional[str] = None,
39
- scattering_table_dir: Optional[str] = None,
40
- products_configs_dir: Optional[str] = None,
41
- folder_partitioning: Optional[str] = None,
42
- zenodo_token: Optional[str] = None,
43
- zenodo_sandbox_token: Optional[str] = None,
34
+ data_archive_dir: str | None = None,
35
+ metadata_archive_dir: str | None = None,
36
+ scattering_table_dir: str | None = None,
37
+ products_configs_dir: str | None = None,
38
+ folder_partitioning: str | None = None,
39
+ zenodo_token: str | None = None,
40
+ zenodo_sandbox_token: str | None = None,
44
41
  ):
45
42
  """
46
43
  Defines the DISDRODB configuration file with the given credentials and base directory.
@@ -194,7 +191,11 @@ def get_scattering_table_dir(scattering_table_dir=None):
194
191
  if scattering_table_dir is None:
195
192
  scattering_table_dir = disdrodb.config.get("scattering_table_dir", None)
196
193
  if scattering_table_dir is None:
197
- raise ValueError("The directory where to save DISDRODB T-Matrix scattering tables is not specified.")
194
+ msg = (
195
+ "The directory where to save DISDRODB T-Matrix scattering look-up tables is not specified. "
196
+ + "Please specify it using disdrodb.define_configs(scattering_table_dir=<path>)"
197
+ )
198
+ raise ValueError(msg)
198
199
  scattering_table_dir = check_scattering_table_dir(scattering_table_dir) # ensure Path converted to str
199
200
  return scattering_table_dir
200
201
 
@@ -246,16 +247,19 @@ def get_default_products_configs_dir():
246
247
  return products_configs_dir
247
248
 
248
249
 
249
- def get_products_configs_dir():
250
+ def get_products_configs_dir(products_configs_dir=None):
250
251
  """Return the DISDRODB products configuration directory."""
251
252
  import disdrodb
252
253
 
253
- if os.environ.get("PYTEST_CURRENT_TEST"):
254
+ if products_configs_dir is not None:
255
+ return str(products_configs_dir)
256
+
257
+ if os.environ.get("PYTEST_CURRENT_TEST") and not os.environ.get("DISDRODB_VALIDATION_FLAG"):
254
258
  products_configs_dir = os.path.join(disdrodb.package_dir, "tests", "products")
255
259
  else:
256
260
  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()
261
+ if products_configs_dir is None: # not specified by user
262
+ products_configs_dir = get_default_products_configs_dir() # take disdrodb defaults
259
263
  return products_configs_dir
260
264
 
261
265
 
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
@@ -15,6 +15,7 @@
15
15
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
16
  # -----------------------------------------------------------------------------.
17
17
  """DISDRODB constants."""
18
+
18
19
  import importlib
19
20
 
20
21
  ARCHIVE_VERSION = "V0"
@@ -41,7 +42,9 @@ COORDINATES = [
41
42
  "time",
42
43
  "sample_interval",
43
44
  ]
44
- OPTICAL_SENSORS = ["PARSIVEL", "PARSIVEL2", "LPM", "LPM_V0", "PWS100", "SWS250"]
45
+ METEOROLOGICAL_VARIABLES = ["air_temperature", "relative_humidity", "wind_speed", "wind_direction"]
46
+
47
+ OPTICAL_SENSORS = ["PARSIVEL", "PARSIVEL2", "LPM", "LPM_V0", "PWS100", "SWS250", "ODM470"]
45
48
  IMPACT_SENSORS = ["RD80"]
46
49
 
47
50
  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