disdrodb 0.2.1__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 (302) 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 +9 -9
  6. disdrodb/api/checks.py +1 -3
  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 +9 -8
  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 +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 +46 -0
  75. disdrodb/fall_velocity/graupel.py +483 -0
  76. disdrodb/fall_velocity/hail.py +287 -0
  77. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +264 -44
  78. disdrodb/issue/__init__.py +1 -3
  79. disdrodb/issue/checks.py +1 -3
  80. disdrodb/issue/reader.py +1 -3
  81. disdrodb/issue/writer.py +1 -3
  82. disdrodb/l0/__init__.py +1 -1
  83. disdrodb/l0/check_configs.py +25 -16
  84. disdrodb/l0/check_standards.py +1 -3
  85. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  86. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  87. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  88. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  89. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  90. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  91. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  92. disdrodb/l0/l0_reader.py +1 -3
  93. disdrodb/l0/l0a_processing.py +1 -3
  94. disdrodb/l0/l0b_nc_processing.py +2 -4
  95. disdrodb/l0/l0b_processing.py +1 -3
  96. disdrodb/l0/l0c_processing.py +27 -11
  97. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
  98. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
  99. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
  100. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
  101. disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
  102. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +47 -6
  103. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +1 -1
  104. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +5 -2
  105. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +1 -3
  106. disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
  107. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  108. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +1 -1
  109. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +1 -3
  110. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +1 -3
  111. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
  112. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
  113. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
  114. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  115. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +1 -3
  116. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +1 -3
  117. disdrodb/l0/readers/LPM_V0/BELGIUM/ULIEGE.py +1 -3
  118. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +1 -1
  119. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
  120. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  121. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
  122. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
  123. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
  124. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
  125. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
  126. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
  127. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
  128. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
  129. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
  130. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
  131. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
  132. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
  133. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
  134. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
  135. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
  136. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
  137. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  151. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +1 -1
  152. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  154. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  155. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  156. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  157. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  158. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  159. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  160. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
  161. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
  164. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  165. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  166. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  167. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
  169. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
  170. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  171. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
  172. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
  173. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  174. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  175. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  176. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
  177. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +1 -1
  178. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  179. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  180. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  181. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_UCLM.py +126 -0
  182. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
  183. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +1 -1
  184. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +1 -1
  185. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +3 -1
  186. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  187. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
  188. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  189. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  190. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
  191. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
  192. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +1 -1
  193. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  195. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
  196. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
  198. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  199. disdrodb/l0/readers/PARSIVEL2/NORWAY/UIB.py +10 -2
  200. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +1 -3
  201. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  202. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
  204. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
  206. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +1 -1
  207. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +1 -1
  208. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
  209. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
  210. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
  211. disdrodb/l0/readers/RD80/BRAZIL/ATTO_RD80.py +1 -3
  212. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  213. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  214. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  215. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  216. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
  217. disdrodb/l0/readers/SWS250/BELGIUM/KMI.py +1 -3
  218. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
  219. disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
  220. disdrodb/l0/standards.py +4 -5
  221. disdrodb/l0/template_tools.py +1 -3
  222. disdrodb/l1/__init__.py +1 -1
  223. disdrodb/l1/classification.py +913 -0
  224. disdrodb/l1/processing.py +36 -106
  225. disdrodb/l1/resampling.py +8 -3
  226. disdrodb/l1_env/__init__.py +1 -1
  227. disdrodb/l1_env/routines.py +6 -6
  228. disdrodb/l2/__init__.py +1 -1
  229. disdrodb/l2/empirical_dsd.py +57 -31
  230. disdrodb/l2/processing.py +327 -62
  231. disdrodb/metadata/checks.py +1 -3
  232. disdrodb/metadata/download.py +4 -4
  233. disdrodb/metadata/geolocation.py +1 -3
  234. disdrodb/metadata/info.py +1 -3
  235. disdrodb/metadata/manipulation.py +1 -3
  236. disdrodb/metadata/reader.py +1 -3
  237. disdrodb/metadata/search.py +1 -3
  238. disdrodb/metadata/standards.py +1 -3
  239. disdrodb/metadata/writer.py +1 -3
  240. disdrodb/physics/__init__.py +17 -0
  241. disdrodb/physics/atmosphere.py +272 -0
  242. disdrodb/physics/water.py +130 -0
  243. disdrodb/physics/wrappers.py +62 -0
  244. disdrodb/psd/__init__.py +1 -1
  245. disdrodb/psd/fitting.py +22 -9
  246. disdrodb/psd/models.py +1 -1
  247. disdrodb/routines/__init__.py +5 -1
  248. disdrodb/routines/l0.py +26 -16
  249. disdrodb/routines/l1.py +8 -6
  250. disdrodb/routines/l2.py +8 -4
  251. disdrodb/routines/options.py +116 -73
  252. disdrodb/routines/options_validation.py +728 -0
  253. disdrodb/routines/wrappers.py +431 -11
  254. disdrodb/scattering/__init__.py +1 -1
  255. disdrodb/scattering/axis_ratio.py +6 -6
  256. disdrodb/scattering/permittivity.py +8 -8
  257. disdrodb/scattering/routines.py +31 -13
  258. disdrodb/summary/__init__.py +1 -1
  259. disdrodb/summary/routines.py +83 -25
  260. disdrodb/utils/__init__.py +1 -1
  261. disdrodb/utils/archiving.py +16 -9
  262. disdrodb/utils/attrs.py +4 -3
  263. disdrodb/utils/cli.py +8 -10
  264. disdrodb/utils/compression.py +9 -11
  265. disdrodb/utils/dask.py +2 -3
  266. disdrodb/utils/dataframe.py +1 -3
  267. disdrodb/utils/decorators.py +1 -3
  268. disdrodb/utils/dict.py +1 -1
  269. disdrodb/utils/directories.py +3 -5
  270. disdrodb/utils/encoding.py +2 -4
  271. disdrodb/utils/event.py +1 -1
  272. disdrodb/utils/list.py +1 -3
  273. disdrodb/utils/logger.py +1 -3
  274. disdrodb/utils/manipulations.py +175 -5
  275. disdrodb/utils/pydantic.py +80 -0
  276. disdrodb/utils/routines.py +1 -3
  277. disdrodb/utils/subsetting.py +1 -1
  278. disdrodb/utils/time.py +3 -2
  279. disdrodb/utils/warnings.py +1 -3
  280. disdrodb/utils/writer.py +1 -3
  281. disdrodb/utils/xarray.py +30 -3
  282. disdrodb/utils/yaml.py +1 -3
  283. disdrodb/viz/__init__.py +1 -1
  284. disdrodb/viz/plots.py +192 -18
  285. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
  286. disdrodb-0.3.0.dist-info/RECORD +358 -0
  287. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
  288. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  289. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  290. disdrodb/etc/products/L1/LPM_V0/1MIN.yaml +0 -13
  291. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  292. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  293. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  294. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  295. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  296. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  297. disdrodb/l1/beard_model.py +0 -662
  298. disdrodb/l1/filters.py +0 -205
  299. disdrodb-0.2.1.dist-info/RECORD +0 -329
  300. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
  301. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
  302. {disdrodb-0.2.1.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,272 @@
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
+ """DISDRODB atmospheric physics module."""
18
+ import numpy as np
19
+ import xarray as xr
20
+
21
+
22
+ def get_gravitational_acceleration(latitude, altitude=0):
23
+ """
24
+ Computes gravitational acceleration at a given altitude and latitude.
25
+
26
+ Parameters
27
+ ----------
28
+ altitude : float
29
+ Altitude in meters. The default is 0 m (sea level).
30
+ latitude : float
31
+ Latitude in degrees.
32
+
33
+ Returns
34
+ -------
35
+ float
36
+ Gravitational acceleration in m/s^2.
37
+ """
38
+ g0 = 9.806229 - 0.025889372 * np.cos(2 * np.deg2rad(latitude))
39
+ return g0 - 2.879513 * altitude / 1e6
40
+
41
+
42
+ def get_air_pressure_at_height(
43
+ altitude,
44
+ latitude,
45
+ temperature,
46
+ sea_level_air_pressure=101_325,
47
+ lapse_rate=0.0065,
48
+ gas_constant_dry_air=287.04,
49
+ ):
50
+ """
51
+ Computes the air pressure at a given height in a standard atmosphere.
52
+
53
+ According to the hypsometric formula of Brutsaert 1982; Ulaby et al. 1981
54
+
55
+ Parameters
56
+ ----------
57
+ altitude : float
58
+ Altitude in meters.
59
+ latitude : float
60
+ Latitude in degrees.
61
+ temperature : float
62
+ Temperature at altitude in Kelvin.
63
+ sea_level_air_pressure : float, optional
64
+ Standard atmospheric pressure at sea level in Pascals. The default is 101_325 Pascals.
65
+ lapse_rate : float, optional
66
+ Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
67
+ gas_constant_dry_air : float, optional
68
+ Gas constant for dry air in J/(kg*K). The default is 287.04 J/(kg*K).
69
+
70
+ Returns
71
+ -------
72
+ float
73
+ Air pressure in Pascals.
74
+ """
75
+ g = get_gravitational_acceleration(altitude=altitude, latitude=latitude)
76
+ return sea_level_air_pressure * np.exp(
77
+ -g / (lapse_rate * gas_constant_dry_air) * np.log(1 + lapse_rate * altitude / temperature),
78
+ )
79
+
80
+
81
+ def get_air_temperature_at_height(altitude, sea_level_temperature, lapse_rate=0.0065):
82
+ """
83
+ Computes the air temperature at a given height in a standard atmosphere.
84
+
85
+ Reference: Brutsaert 1982; Ulaby et al. 1981
86
+
87
+ Parameters
88
+ ----------
89
+ altitude : float
90
+ Altitude in meters.
91
+ sea_level_temperature : float
92
+ Standard temperature at sea level in Kelvin.
93
+ lapse_rate : float, optional
94
+ Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
95
+
96
+ Returns
97
+ -------
98
+ float
99
+ Air temperature in Kelvin.
100
+ """
101
+ return sea_level_temperature - lapse_rate * altitude
102
+
103
+
104
+ def get_air_dynamic_viscosity(temperature):
105
+ """
106
+ Computes the dynamic viscosity of dry air.
107
+
108
+ Reference: Beard 1977; Pruppacher & Klett 1978
109
+
110
+ Parameters
111
+ ----------
112
+ temperature : float
113
+ Temperature in Kelvin.
114
+
115
+ Returns
116
+ -------
117
+ float
118
+ Dynamic viscosity of dry air in kg/(m*s) (aka Pa*s).
119
+ """
120
+ # Convert to Celsius
121
+ temperature = temperature - 273.15
122
+
123
+ # Define mask
124
+ above_freezing_mask = temperature > 0
125
+
126
+ # Compute viscosity above freezing temperature
127
+ viscosity_above_0 = (1.721 + 0.00487 * temperature) / 1e5
128
+
129
+ # Compute viscosity below freezing temperature
130
+ viscosity_below_0 = (1.718 + 0.0049 * temperature - 1.2 * temperature**2 / 1e5) / 1e5
131
+
132
+ # Define final viscosity
133
+ viscosity = xr.where(above_freezing_mask, viscosity_above_0, viscosity_below_0)
134
+ return viscosity
135
+
136
+
137
+ def get_air_density(temperature, air_pressure, vapor_pressure, gas_constant_dry_air=287.04):
138
+ """
139
+ Computes the air density according to the equation of state for moist air.
140
+
141
+ Reference: Brutsaert 1982
142
+
143
+ Parameters
144
+ ----------
145
+ temperature : float
146
+ Temperature in Kelvin.
147
+ air_pressure : float
148
+ Air pressure in Pascals.
149
+ vapor_pressure : float
150
+ Vapor pressure in Pascals.
151
+ gas_constant_dry_air : float, optional
152
+ Gas constant for dry air in J/(kg*K). The default is 287.04 J/(kg*K).
153
+
154
+ Returns
155
+ -------
156
+ float
157
+ Air density in kg/m^3.
158
+ """
159
+ # # Define constant for water vapor in J/(kg·K)
160
+ # gas_constant_water_vapor=461.5
161
+
162
+ # # Partial pressure of dry air (Pa)
163
+ # pressure_dry_air = air_pressure - vapor_pressure
164
+
165
+ # # Density of dry air (kg/m^3)
166
+ # density_dry_air = pressure_dry_air / (gas_constant_dry_air * temperature)
167
+
168
+ # # Density of water vapor (kg/m^3)
169
+ # density_water_vapor = vapor_pressure / (gas_constant_water_vapor * temperature)
170
+
171
+ # # Total air density (kg/m^3)
172
+ # air_density = density_dry_air + density_water_vapor
173
+
174
+ return air_pressure * (1 - 0.378 * vapor_pressure / air_pressure) / (gas_constant_dry_air * temperature)
175
+
176
+
177
+ def get_vapor_actual_pressure_at_height(
178
+ altitude,
179
+ sea_level_temperature,
180
+ sea_level_relative_humidity,
181
+ sea_level_air_pressure=101_325,
182
+ lapse_rate=0.0065,
183
+ ):
184
+ """
185
+ Computes the vapor pressure using Yamamoto's exponential relationship.
186
+
187
+ Reference: Brutsaert 1982
188
+
189
+ Parameters
190
+ ----------
191
+ altitude : float
192
+ Altitude in meters.
193
+ sea_level_temperature : float
194
+ Standard temperature at sea level in Kelvin.
195
+ sea_level_relative_humidity : float
196
+ Relative humidity at sea level. A value between 0 and 1.
197
+ sea_level_air_pressure : float, optional
198
+ Standard atmospheric pressure at sea level in Pascals. The default is 101_325 Pascals.
199
+ lapse_rate : float, optional
200
+ Standard atmospheric lapse rate in K/m. The default is 0.0065 K/m.
201
+
202
+ Returns
203
+ -------
204
+ float
205
+ Vapor pressure in Pascals.
206
+ """
207
+ temperature_at_altitude = get_air_temperature_at_height(
208
+ altitude=altitude,
209
+ sea_level_temperature=sea_level_temperature,
210
+ lapse_rate=lapse_rate,
211
+ )
212
+ esat = get_vapor_saturation_pressure(sea_level_temperature)
213
+ actual_vapor = sea_level_relative_humidity / (1 / esat - (1 - sea_level_relative_humidity) / sea_level_air_pressure)
214
+ return actual_vapor * np.exp(-(5.8e3 * lapse_rate / (temperature_at_altitude**2) + 5.5e-5) * altitude)
215
+
216
+
217
+ def get_vapor_saturation_pressure(temperature):
218
+ """
219
+ Computes the saturation vapor pressure over water as a function of temperature.
220
+
221
+ Use formulation and coefficients of Wexler (1976, 1977).
222
+ References: Brutsaert 1982; Pruppacher & Klett 1978; Flatau & al. 1992
223
+
224
+ Parameters
225
+ ----------
226
+ temperature : float
227
+ Temperature in Kelvin.
228
+
229
+ Returns
230
+ -------
231
+ float
232
+ Saturation vapor pressure in Pascal.
233
+ """
234
+ # Polynomial coefficients
235
+ g = [
236
+ -0.29912729e4,
237
+ -0.60170128e4,
238
+ 0.1887643854e2,
239
+ -0.28354721e-1,
240
+ 0.17838301e-4,
241
+ -0.84150417e-9,
242
+ 0.44412543e-12,
243
+ 0.2858487e1,
244
+ ]
245
+ # Perform polynomial accumulation using Horner rule
246
+ esat = g[6]
247
+ for i in [5, 4, 3, 2]:
248
+ esat = esat * temperature + g[i]
249
+ esat = esat + g[7] * np.log(temperature)
250
+ for i in [1, 0]:
251
+ esat = esat * temperature + g[i]
252
+ return np.exp(esat / (temperature**2))
253
+
254
+
255
+ def get_vapor_actual_pressure(relative_humidity, temperature):
256
+ """
257
+ Computes the actual vapor pressure over water.
258
+
259
+ Parameters
260
+ ----------
261
+ relative_humidity : float
262
+ Relative humidity. A value between 0 and 1.
263
+ temperature : float
264
+ Temperature in Kelvin.
265
+
266
+ Returns
267
+ -------
268
+ float
269
+ Actual vapor pressure in Pascal.
270
+ """
271
+ esat = get_vapor_saturation_pressure(temperature)
272
+ return relative_humidity * esat
@@ -0,0 +1,130 @@
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
+ """DISDRODB water physics module."""
18
+ import numpy as np
19
+ import xarray as xr
20
+
21
+
22
+ def get_pure_water_density(temperature):
23
+ """
24
+ Computes the density of pure water at standard pressure.
25
+
26
+ For temperatures above freezing uses Kell formulation.
27
+ For temperatures below freezing use Dorsch & Boyd formulation.
28
+
29
+ References: Pruppacher & Klett 1978; Weast & Astle 1980
30
+
31
+ Parameters
32
+ ----------
33
+ temperature : float
34
+ Temperature in Kelvin.
35
+
36
+ Returns
37
+ -------
38
+ float
39
+ Density of pure water in kg/m^3.
40
+ """
41
+ # Convert to Celsius
42
+ temperature = temperature - 273.15
43
+
44
+ # Define mask
45
+ above_freezing_mask = temperature > 0
46
+
47
+ # Compute density above freezing temperature
48
+ c = [9.9983952e2, 1.6945176e1, -7.9870401e-3, -4.6170461e-5, 1.0556302e-7, -2.8054253e-10, 1.6879850e-2]
49
+ density = c[0] + sum(c * temperature**i for i, c in enumerate(c[1:6], start=1))
50
+ density_above_0 = density / (1 + c[6] * temperature)
51
+
52
+ # Compute density below freezing temperature
53
+ c = [999.84, 0.086, -0.0108]
54
+ density_below_0 = c[0] + sum(c * temperature**i for i, c in enumerate(c[1:], start=1))
55
+
56
+ # Define final density
57
+ density = xr.where(above_freezing_mask, density_above_0, density_below_0)
58
+ return density
59
+
60
+
61
+ def get_pure_water_compressibility(temperature):
62
+ """
63
+ Computes the isothermal compressibility of pure ordinary water.
64
+
65
+ Reference: Kell, Weast & Astle 1980
66
+
67
+ Parameters
68
+ ----------
69
+ temperature : float
70
+ Temperature in Kelvin.
71
+
72
+ Returns
73
+ -------
74
+ float
75
+ Compressibility of water in Pascals.
76
+ """
77
+ # Convert to Celsius
78
+ temperature = temperature - 273.15
79
+
80
+ # Compute compressibility
81
+ c = [5.088496e1, 6.163813e-1, 1.459187e-3, 2.008438e-5, -5.857727e-8, 4.10411e-10, 1.967348e-2]
82
+ compressibility = c[0] + sum(c * temperature**i for i, c in enumerate(c[1:6], start=1))
83
+ compressibility = compressibility / (1 + c[6] * temperature) * 1e-11
84
+ return compressibility
85
+
86
+
87
+ def get_pure_water_surface_tension(temperature):
88
+ """
89
+ Computes the surface tension of pure ordinary water against air.
90
+
91
+ Reference: Pruppacher & Klett 1978
92
+
93
+ Parameters
94
+ ----------
95
+ temperature : float
96
+ Temperature in Kelvin.
97
+
98
+ Returns
99
+ -------
100
+ float
101
+ Surface tension in N/m.
102
+ """
103
+ sigma = 0.0761 - 0.000155 * (temperature - 273.15)
104
+ return sigma
105
+
106
+
107
+ def get_water_density(temperature, air_pressure, sea_level_air_pressure=101_325):
108
+ """
109
+ Computes the density of water according to Weast & Astle 1980.
110
+
111
+ Parameters
112
+ ----------
113
+ temperature : float
114
+ Temperature in Kelvin.
115
+ air_pressure : float
116
+ Air pressure in Pascals.
117
+ sea_level_air_pressure : float
118
+ Standard atmospheric pressure at sea level in Pascals.
119
+ The default is 101_325 Pascal.
120
+ freezing_temperature : float, optional
121
+ Freezing temperature of water in Kelvin. The default is 273.15 K.
122
+
123
+ Returns
124
+ -------
125
+ float
126
+ Water density in kg/m^3.
127
+ """
128
+ delta_pressure = sea_level_air_pressure - air_pressure
129
+ water_compressibility = get_pure_water_compressibility(temperature)
130
+ return get_pure_water_density(temperature) * np.exp(-1 * water_compressibility * delta_pressure)
@@ -0,0 +1,62 @@
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
+ """DISDRODB physics wrapper functions."""
18
+ from disdrodb.physics.atmosphere import (
19
+ get_air_density,
20
+ get_air_dynamic_viscosity,
21
+ get_air_pressure_at_height,
22
+ get_vapor_actual_pressure,
23
+ )
24
+
25
+
26
+ ####---------------------------------------------------------------------------.
27
+ #### Wrappers
28
+ def retrieve_air_pressure(ds_env):
29
+ """Retrieve air pressure."""
30
+ if "air_pressure" in ds_env:
31
+ return ds_env["air_pressure"]
32
+ air_pressure = get_air_pressure_at_height(
33
+ altitude=ds_env["altitude"],
34
+ latitude=ds_env["latitude"],
35
+ temperature=ds_env["temperature"],
36
+ sea_level_air_pressure=ds_env["sea_level_air_pressure"],
37
+ lapse_rate=ds_env["lapse_rate"],
38
+ )
39
+ return air_pressure
40
+
41
+
42
+ def retrieve_air_dynamic_viscosity(ds_env):
43
+ """Retrieve air dynamic viscosity."""
44
+ air_viscosity = get_air_dynamic_viscosity(ds_env["temperature"])
45
+ return air_viscosity
46
+
47
+
48
+ def retrieve_air_density(ds_env):
49
+ """Retrieve air density."""
50
+ temperature = ds_env["temperature"]
51
+ relative_humidity = ds_env["relative_humidity"]
52
+ air_pressure = retrieve_air_pressure(ds_env)
53
+ vapor_pressure = get_vapor_actual_pressure(
54
+ relative_humidity=relative_humidity,
55
+ temperature=temperature,
56
+ )
57
+ air_density = get_air_density(
58
+ temperature=temperature,
59
+ air_pressure=air_pressure,
60
+ vapor_pressure=vapor_pressure,
61
+ )
62
+ return air_density
disdrodb/psd/__init__.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
disdrodb/psd/fitting.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
@@ -23,7 +23,7 @@ from scipy.optimize import minimize
23
23
  from scipy.special import gamma, gammaln # Regularized lower incomplete gamma function
24
24
 
25
25
  from disdrodb.constants import DIAMETER_DIMENSION
26
- from disdrodb.l1.fall_velocity import get_raindrop_fall_velocity_from_ds
26
+ from disdrodb.fall_velocity import get_rain_fall_velocity_from_ds
27
27
  from disdrodb.l2.empirical_dsd import (
28
28
  get_median_volume_drop_diameter,
29
29
  get_moment,
@@ -1056,14 +1056,26 @@ def _compute_z(ND, D, dD):
1056
1056
  return Z
1057
1057
 
1058
1058
 
1059
- def _compute_target_variable_error(target, ND_obs, ND_preds, D, dD, V):
1059
+ def _compute_target_variable_error(target, ND_obs, ND_preds, D, dD, V, relative=False, eps=1e-12):
1060
+ # Compute observed and predicted target variables
1060
1061
  if target == "Z":
1061
- errors = np.abs(_compute_z(ND_obs, D, dD) - _compute_z(ND_preds, D, dD))
1062
+ obs = _compute_z(ND_obs, D, dD)
1063
+ pred = _compute_z(ND_preds, D, dD)
1062
1064
  elif target == "R":
1063
- errors = np.abs(_compute_rain_rate(ND_obs, D, dD, V) - _compute_rain_rate(ND_preds, D, dD, V))
1064
- else: # if target == "LWC":
1065
- errors = np.abs(_compute_lwc(ND_obs, D, dD) - _compute_lwc(ND_preds, D, dD))
1066
- return errors
1065
+ obs = _compute_rain_rate(ND_obs, D, dD, V)
1066
+ pred = _compute_rain_rate(ND_preds, D, dD, V)
1067
+ else: # "LWC"
1068
+ obs = _compute_lwc(ND_obs, D, dD)
1069
+ pred = _compute_lwc(ND_preds, D, dD)
1070
+
1071
+ # Absolute error
1072
+ abs_error = np.abs(obs - pred)
1073
+
1074
+ # Return relative error if requested
1075
+ if relative:
1076
+ return abs_error / (np.abs(obs) + eps)
1077
+
1078
+ return abs_error
1067
1079
 
1068
1080
 
1069
1081
  def _compute_cost_function(ND_obs, ND_preds, D, dD, V, target, transformation, error_order):
@@ -1992,6 +2004,7 @@ ATTRS_PARAMS_DICT = {
1992
2004
  },
1993
2005
  }
1994
2006
 
2007
+ PSD_MODELS = list(ATTRS_PARAMS_DICT)
1995
2008
 
1996
2009
  MOM_METHODS_DICT = {
1997
2010
  "GammaPSD": {
@@ -2356,7 +2369,7 @@ def get_gs_parameters(ds, psd_model, target="ND", transformation="log", error_or
2356
2369
 
2357
2370
  # Check fall velocity is available if target R
2358
2371
  if "fall_velocity" not in ds:
2359
- ds["fall_velocity"] = get_raindrop_fall_velocity_from_ds(ds)
2372
+ ds["fall_velocity"] = get_rain_fall_velocity_from_ds(ds)
2360
2373
 
2361
2374
  # Retrieve estimation function
2362
2375
  func = OPTIMIZATION_ROUTINES_DICT["GS"][psd_model]
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
@@ -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
@@ -18,6 +18,7 @@
18
18
  from disdrodb.routines.wrappers import (
19
19
  create_summary,
20
20
  create_summary_station,
21
+ run,
21
22
  run_l0,
22
23
  run_l0_station,
23
24
  run_l0a,
@@ -32,11 +33,13 @@ from disdrodb.routines.wrappers import (
32
33
  run_l2e_station,
33
34
  run_l2m,
34
35
  run_l2m_station,
36
+ run_station,
35
37
  )
36
38
 
37
39
  __all__ = [
38
40
  "create_summary",
39
41
  "create_summary_station",
42
+ "run",
40
43
  "run_l0",
41
44
  "run_l0_station",
42
45
  "run_l0a",
@@ -51,4 +54,5 @@ __all__ = [
51
54
  "run_l2e_station",
52
55
  "run_l2m",
53
56
  "run_l2m_station",
57
+ "run_station",
54
58
  ]
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
@@ -50,6 +48,7 @@ from disdrodb.l0.l0b_nc_processing import sanitize_ds
50
48
  from disdrodb.l0.l0b_processing import generate_l0b
51
49
  from disdrodb.l0.l0c_processing import TOLERANCE_SECONDS, create_l0c_datasets
52
50
  from disdrodb.metadata import read_station_metadata
51
+ from disdrodb.routines.options import L0CProcessingOptions
53
52
  from disdrodb.utils.archiving import group_files_by_time_block
54
53
  from disdrodb.utils.dask import execute_tasks_safely
55
54
  from disdrodb.utils.decorators import delayed_if_parallel, single_threaded_if_parallel
@@ -329,6 +328,7 @@ def _generate_l0c(
329
328
  # Processing info
330
329
  metadata,
331
330
  # Processing options
331
+ folder_partitioning,
332
332
  force,
333
333
  verbose,
334
334
  parallel, # this is used only to initialize the correct logger !
@@ -336,8 +336,6 @@ def _generate_l0c(
336
336
  """Define L0C product processing."""
337
337
  # Define product
338
338
  product = "L0C"
339
- # Define folder partitioning
340
- folder_partitioning = get_folder_partitioning()
341
339
 
342
340
  # Define product processing function
343
341
  def core(
@@ -873,15 +871,6 @@ def run_l0c_station(
873
871
  station_name=station_name,
874
872
  )
875
873
 
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
874
  # ------------------------------------------------------------------------.
886
875
  # Start processing
887
876
  t_i = time.time()
@@ -925,10 +914,30 @@ def run_l0c_station(
925
914
  if filepaths is None:
926
915
  return
927
916
 
917
+ # -----------------------------------------------------------------.
918
+ # Read station metadata and sensor name
919
+ metadata = read_station_metadata(
920
+ metadata_archive_dir=metadata_archive_dir,
921
+ data_source=data_source,
922
+ campaign_name=campaign_name,
923
+ station_name=station_name,
924
+ )
925
+ sensor_name = metadata["sensor_name"]
926
+
927
+ # -------------------------------------------------------------------------.
928
+ # Retrieve L0C processing options
929
+ l0c_processing_options = L0CProcessingOptions(sensor_name=sensor_name)
930
+ product_frequency = l0c_processing_options.product_frequency
931
+ folder_partitioning = l0c_processing_options.folder_partitioning
932
+
928
933
  # -------------------------------------------------------------------------.
929
934
  # 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)
935
+ # - Default is "day". If "month", risk of going out of memory on small laptops
936
+ list_event_info = group_files_by_time_block(
937
+ filepaths=filepaths,
938
+ freq=product_frequency,
939
+ tolerance_seconds=TOLERANCE_SECONDS,
940
+ )
932
941
 
933
942
  # -----------------------------------------------------------------.
934
943
  # Generate L0C files
@@ -941,6 +950,7 @@ def run_l0c_station(
941
950
  data_dir=data_dir,
942
951
  logs_dir=logs_dir,
943
952
  logs_filename=event_info["start_time"].strftime("%Y%m%dT%H%M%S"),
953
+ folder_partitioning=folder_partitioning,
944
954
  # Processing options
945
955
  force=force,
946
956
  verbose=verbose,