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
disdrodb/psd/models.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
@@ -24,6 +24,7 @@ Source code:
24
24
  - https://github.com/wolfidan/pyradsim/blob/master/pyradsim/psd.py
25
25
 
26
26
  """
27
+
27
28
  import importlib
28
29
 
29
30
  import dask.array
@@ -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,9 +15,11 @@
15
15
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
16
  # -----------------------------------------------------------------------------.
17
17
  """DISDRODB L0 software."""
18
+
18
19
  from disdrodb.routines.wrappers import (
19
20
  create_summary,
20
21
  create_summary_station,
22
+ run,
21
23
  run_l0,
22
24
  run_l0_station,
23
25
  run_l0a,
@@ -32,11 +34,13 @@ from disdrodb.routines.wrappers import (
32
34
  run_l2e_station,
33
35
  run_l2m,
34
36
  run_l2m_station,
37
+ run_station,
35
38
  )
36
39
 
37
40
  __all__ = [
38
41
  "create_summary",
39
42
  "create_summary_station",
43
+ "run",
40
44
  "run_l0",
41
45
  "run_l0_station",
42
46
  "run_l0a",
@@ -51,4 +55,5 @@ __all__ = [
51
55
  "run_l2e_station",
52
56
  "run_l2m",
53
57
  "run_l2m_station",
58
+ "run_station",
54
59
  ]
disdrodb/routines/l0.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
@@ -22,7 +20,6 @@ import datetime
22
20
  import logging
23
21
  import os
24
22
  import time
25
- from typing import Optional
26
23
 
27
24
  from disdrodb.api.checks import check_measurement_intervals, check_sensor_name, check_station_inputs
28
25
  from disdrodb.api.create_directories import (
@@ -50,6 +47,7 @@ from disdrodb.l0.l0b_nc_processing import sanitize_ds
50
47
  from disdrodb.l0.l0b_processing import generate_l0b
51
48
  from disdrodb.l0.l0c_processing import TOLERANCE_SECONDS, create_l0c_datasets
52
49
  from disdrodb.metadata import read_station_metadata
50
+ from disdrodb.routines.options import L0CProcessingOptions
53
51
  from disdrodb.utils.archiving import group_files_by_time_block
54
52
  from disdrodb.utils.dask import execute_tasks_safely
55
53
  from disdrodb.utils.decorators import delayed_if_parallel, single_threaded_if_parallel
@@ -329,6 +327,7 @@ def _generate_l0c(
329
327
  # Processing info
330
328
  metadata,
331
329
  # Processing options
330
+ folder_partitioning,
332
331
  force,
333
332
  verbose,
334
333
  parallel, # this is used only to initialize the correct logger !
@@ -336,8 +335,6 @@ def _generate_l0c(
336
335
  """Define L0C product processing."""
337
336
  # Define product
338
337
  product = "L0C"
339
- # Define folder partitioning
340
- folder_partitioning = get_folder_partitioning()
341
338
 
342
339
  # Define product processing function
343
340
  def core(
@@ -370,11 +367,16 @@ def _generate_l0c(
370
367
 
371
368
  # Write a dataset for each sample interval
372
369
  valid_datasets = []
373
- for ds in dict_ds.values(): # (sample_interval, ds)
370
+ for sample_interval, ds in dict_ds.items():
374
371
  # Write L0C netCDF4 dataset
375
372
  if ds["time"].size > 1:
376
373
  # Write L0C netCDF4 dataset
377
- filename = define_l0c_filename(ds, campaign_name=campaign_name, station_name=station_name)
374
+ filename = define_l0c_filename(
375
+ ds,
376
+ campaign_name=campaign_name,
377
+ station_name=station_name,
378
+ sample_interval=sample_interval,
379
+ )
378
380
  folder_path = define_file_folder_path(ds, dir_path=data_dir, folder_partitioning=folder_partitioning)
379
381
  filepath = os.path.join(folder_path, filename)
380
382
  write_product(ds, filepath=filepath, force=force)
@@ -428,8 +430,8 @@ def run_l0a_station(
428
430
  debugging_mode: bool = False,
429
431
  parallel: bool = True,
430
432
  # DISDRODB root directories
431
- data_archive_dir: Optional[str] = None,
432
- metadata_archive_dir: Optional[str] = None,
433
+ data_archive_dir: str | None = None,
434
+ metadata_archive_dir: str | None = None,
433
435
  ):
434
436
  """
435
437
  Run the L0A processing of a specific DISDRODB station when invoked from the terminal.
@@ -623,8 +625,8 @@ def run_l0b_station(
623
625
  parallel: bool = True,
624
626
  debugging_mode: bool = False,
625
627
  # DISDRODB root directories
626
- data_archive_dir: Optional[str] = None,
627
- metadata_archive_dir: Optional[str] = None,
628
+ data_archive_dir: str | None = None,
629
+ metadata_archive_dir: str | None = None,
628
630
  ):
629
631
  """
630
632
  Run the L0B processing of a specific DISDRODB station when invoked from the terminal.
@@ -804,8 +806,8 @@ def run_l0c_station(
804
806
  parallel: bool = True,
805
807
  debugging_mode: bool = False,
806
808
  # DISDRODB root directories
807
- data_archive_dir: Optional[str] = None,
808
- metadata_archive_dir: Optional[str] = None,
809
+ data_archive_dir: str | None = None,
810
+ metadata_archive_dir: str | None = None,
809
811
  ):
810
812
  """
811
813
  Run the L0C processing of a specific DISDRODB station when invoked from the terminal.
@@ -873,15 +875,6 @@ def run_l0c_station(
873
875
  station_name=station_name,
874
876
  )
875
877
 
876
- # -----------------------------------------------------------------.
877
- # Retrieve metadata
878
- metadata = read_station_metadata(
879
- metadata_archive_dir=metadata_archive_dir,
880
- data_source=data_source,
881
- campaign_name=campaign_name,
882
- station_name=station_name,
883
- )
884
-
885
878
  # ------------------------------------------------------------------------.
886
879
  # Start processing
887
880
  t_i = time.time()
@@ -925,10 +918,30 @@ def run_l0c_station(
925
918
  if filepaths is None:
926
919
  return
927
920
 
921
+ # -----------------------------------------------------------------.
922
+ # Read station metadata and sensor name
923
+ metadata = read_station_metadata(
924
+ metadata_archive_dir=metadata_archive_dir,
925
+ data_source=data_source,
926
+ campaign_name=campaign_name,
927
+ station_name=station_name,
928
+ )
929
+ sensor_name = metadata["sensor_name"]
930
+
931
+ # -------------------------------------------------------------------------.
932
+ # Retrieve L0C processing options
933
+ l0c_processing_options = L0CProcessingOptions(sensor_name=sensor_name)
934
+ product_frequency = l0c_processing_options.product_frequency
935
+ folder_partitioning = l0c_processing_options.folder_partitioning
936
+
928
937
  # -------------------------------------------------------------------------.
929
938
  # Retrieve dictionary with the required files per time block
930
- # TODO: allow customizing this in config file, but risk of out of memory !
931
- list_event_info = group_files_by_time_block(filepaths=filepaths, freq="day", tolerance_seconds=TOLERANCE_SECONDS)
939
+ # - Default is "day". If "month", risk of going out of memory on small laptops
940
+ list_event_info = group_files_by_time_block(
941
+ filepaths=filepaths,
942
+ freq=product_frequency,
943
+ tolerance_seconds=TOLERANCE_SECONDS,
944
+ )
932
945
 
933
946
  # -----------------------------------------------------------------.
934
947
  # Generate L0C files
@@ -941,6 +954,7 @@ def run_l0c_station(
941
954
  data_dir=data_dir,
942
955
  logs_dir=logs_dir,
943
956
  logs_filename=event_info["start_time"].strftime("%Y%m%dT%H%M%S"),
957
+ folder_partitioning=folder_partitioning,
944
958
  # Processing options
945
959
  force=force,
946
960
  verbose=verbose,
disdrodb/routines/l1.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
@@ -22,7 +20,6 @@ import datetime
22
20
  import logging
23
21
  import os
24
22
  import time
25
- from typing import Optional
26
23
 
27
24
  import pandas as pd
28
25
 
@@ -42,6 +39,8 @@ from disdrodb.configs import (
42
39
  get_folder_partitioning,
43
40
  get_metadata_archive_dir,
44
41
  )
42
+ from disdrodb.constants import METEOROLOGICAL_VARIABLES
43
+ from disdrodb.l1.classification import TEMPERATURE_VARIABLES
45
44
  from disdrodb.l1.processing import generate_l1
46
45
  from disdrodb.l1.resampling import resample_dataset
47
46
  from disdrodb.metadata.reader import read_station_metadata
@@ -144,15 +143,23 @@ def _generate_l1(
144
143
  folder_partitioning,
145
144
  ):
146
145
  """Define L1 product processing."""
146
+ import dask
147
+
148
+ # Define variables to load
149
+ # - precip_flag used for OceanRain ODM470 data only
150
+ # - Missing variables in dataset are simply not selected
151
+ variables = ["raw_drop_number", "qc_time", "precip_flag", *TEMPERATURE_VARIABLES, *METEOROLOGICAL_VARIABLES]
152
+
147
153
  # Open the L0C netCDF files
148
- ds = open_netcdf_files(
149
- filepaths,
150
- start_time=start_time,
151
- end_time=end_time,
152
- variables=["raw_drop_number", "time_qc"],
153
- parallel=False,
154
- compute=True,
155
- )
154
+ with dask.config.set(scheduler="single-threaded"): # synchronous
155
+ ds = open_netcdf_files(
156
+ filepaths,
157
+ start_time=start_time,
158
+ end_time=end_time,
159
+ variables=variables,
160
+ parallel=False,
161
+ compute=True,
162
+ )
156
163
 
157
164
  # Define sample interval in seconds
158
165
  sample_interval = ensure_sample_interval_in_seconds(ds["sample_interval"]).to_numpy().item()
@@ -231,8 +238,8 @@ def run_l1_station(
231
238
  parallel: bool = True,
232
239
  debugging_mode: bool = False,
233
240
  # DISDRODB root directories
234
- data_archive_dir: Optional[str] = None,
235
- metadata_archive_dir: Optional[str] = None,
241
+ data_archive_dir: str | None = None,
242
+ metadata_archive_dir: str | None = None,
236
243
  ):
237
244
  """
238
245
  Run the L1 processing of a specific DISDRODB station when invoked from the terminal.
@@ -313,7 +320,7 @@ def run_l1_station(
313
320
  return
314
321
 
315
322
  # -------------------------------------------------------------------------.
316
- # Read station metadata and retrieve sensor name
323
+ # Read station metadata and sensor name
317
324
  metadata = read_station_metadata(
318
325
  metadata_archive_dir=metadata_archive_dir,
319
326
  data_source=data_source,
@@ -334,6 +341,7 @@ def run_l1_station(
334
341
  # Generate products for each temporal resolution
335
342
  # temporal_resolution = "1MIN"
336
343
  # temporal_resolution = "10MIN"
344
+ # temporal_resolution = "ROLL2MIN"
337
345
  for temporal_resolution in l1_processing_options.temporal_resolutions:
338
346
  # Print progress message
339
347
  msg = f"Production of {product} {temporal_resolution} has started."
@@ -347,7 +355,6 @@ def run_l1_station(
347
355
 
348
356
  # Retrieve product options
349
357
  product_options = l1_processing_options.get_product_options(temporal_resolution)
350
- product_options = product_options.get("product_options")
351
358
 
352
359
  # ------------------------------------------------------------------.
353
360
  # Create product directory
disdrodb/routines/l2.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
@@ -21,7 +21,6 @@ import datetime
21
21
  import logging
22
22
  import os
23
23
  import time
24
- from typing import Optional
25
24
 
26
25
  import pandas as pd
27
26
 
@@ -215,8 +214,8 @@ def run_l2e_station(
215
214
  parallel: bool = True,
216
215
  debugging_mode: bool = False,
217
216
  # DISDRODB root directories
218
- data_archive_dir: Optional[str] = None,
219
- metadata_archive_dir: Optional[str] = None,
217
+ data_archive_dir: str | None = None,
218
+ metadata_archive_dir: str | None = None,
220
219
  ):
221
220
  """
222
221
  Generate the L2E product of a specific DISDRODB station when invoked from the terminal.
@@ -297,6 +296,7 @@ def run_l2e_station(
297
296
  campaign_name=campaign_name,
298
297
  station_name=station_name,
299
298
  )
299
+ sensor_name = metadata["sensor_name"]
300
300
  sample_interval = metadata["measurement_interval"]
301
301
  if isinstance(sample_interval, list):
302
302
  sample_interval = min(sample_interval)
@@ -305,7 +305,7 @@ def run_l2e_station(
305
305
  # Generate products for each temporal resolution
306
306
  # temporal_resolution = "1MIN"
307
307
  # temporal_resolution = "10MIN"
308
- temporal_resolutions = get_product_temporal_resolutions(product)
308
+ temporal_resolutions = get_product_temporal_resolutions(product=product, sensor_name=sensor_name)
309
309
  for temporal_resolution in temporal_resolutions:
310
310
 
311
311
  # ------------------------------------------------------------------.
@@ -339,6 +339,7 @@ def run_l2e_station(
339
339
  l2e_processing_options = L2ProcessingOptions(
340
340
  product=product,
341
341
  temporal_resolution=temporal_resolution,
342
+ sensor_name=sensor_name,
342
343
  filepaths=filepaths,
343
344
  parallel=parallel,
344
345
  )
@@ -621,8 +622,8 @@ def run_l2m_station(
621
622
  parallel: bool = True,
622
623
  debugging_mode: bool = False,
623
624
  # DISDRODB root directories
624
- data_archive_dir: Optional[str] = None,
625
- metadata_archive_dir: Optional[str] = None,
625
+ data_archive_dir: str | None = None,
626
+ metadata_archive_dir: str | None = None,
626
627
  ):
627
628
  """
628
629
  Run the L2M processing of a specific DISDRODB station when invoked from the terminal.
@@ -692,6 +693,7 @@ def run_l2m_station(
692
693
  campaign_name=campaign_name,
693
694
  station_name=station_name,
694
695
  )
696
+ sensor_name = metadata["sensor_name"]
695
697
  sample_interval = metadata["measurement_interval"]
696
698
  if isinstance(sample_interval, list):
697
699
  sample_interval = min(sample_interval)
@@ -700,7 +702,7 @@ def run_l2m_station(
700
702
  # Loop
701
703
  # temporal_resolution = "1MIN"
702
704
  # temporal_resolution = "10MIN"
703
- temporal_resolutions = get_product_temporal_resolutions(product)
705
+ temporal_resolutions = get_product_temporal_resolutions(product=product, sensor_name=sensor_name)
704
706
  for temporal_resolution in temporal_resolutions:
705
707
 
706
708
  # ------------------------------------------------------------------.
@@ -734,6 +736,7 @@ def run_l2m_station(
734
736
  l2m_processing_options = L2ProcessingOptions(
735
737
  product=product,
736
738
  temporal_resolution=temporal_resolution,
739
+ sensor_name=sensor_name,
737
740
  filepaths=filepaths,
738
741
  parallel=parallel,
739
742
  )
@@ -766,7 +769,7 @@ def run_l2m_station(
766
769
  # -----------------------------------------------------------------.
767
770
  # Retrieve product-model options
768
771
  product_options = copy.deepcopy(global_product_options)
769
- model_options = get_model_options(product="L2M", model_name=model_name)
772
+ model_options = get_model_options(model_name=model_name)
770
773
  product_options["product_options"].update(model_options)
771
774
 
772
775
  psd_model = model_options["psd_model"]