disdrodb 0.2.0__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. disdrodb/__init__.py +1 -1
  2. disdrodb/_config.py +1 -3
  3. disdrodb/_version.py +2 -2
  4. disdrodb/accessor/__init__.py +1 -1
  5. disdrodb/accessor/methods.py +18 -11
  6. disdrodb/api/checks.py +2 -4
  7. disdrodb/api/configs.py +1 -3
  8. disdrodb/api/create_directories.py +4 -6
  9. disdrodb/api/info.py +1 -3
  10. disdrodb/api/io.py +15 -9
  11. disdrodb/api/path.py +1 -3
  12. disdrodb/cli/disdrodb_check_metadata_archive.py +2 -2
  13. disdrodb/cli/disdrodb_check_products_options.py +44 -0
  14. disdrodb/cli/disdrodb_create_summary.py +48 -22
  15. disdrodb/cli/disdrodb_create_summary_station.py +39 -18
  16. disdrodb/cli/disdrodb_data_archive_directory.py +1 -3
  17. disdrodb/cli/disdrodb_download_archive.py +45 -24
  18. disdrodb/cli/disdrodb_download_metadata_archive.py +27 -16
  19. disdrodb/cli/disdrodb_download_station.py +56 -26
  20. disdrodb/cli/disdrodb_initialize_station.py +40 -20
  21. disdrodb/cli/disdrodb_metadata_archive_directory.py +1 -3
  22. disdrodb/cli/disdrodb_open_data_archive.py +16 -11
  23. disdrodb/cli/disdrodb_open_logs_directory.py +29 -18
  24. disdrodb/cli/disdrodb_open_metadata_archive.py +25 -11
  25. disdrodb/cli/disdrodb_open_metadata_directory.py +32 -20
  26. disdrodb/cli/disdrodb_open_product_directory.py +38 -21
  27. disdrodb/cli/disdrodb_open_readers_directory.py +1 -3
  28. disdrodb/cli/disdrodb_run.py +189 -0
  29. disdrodb/cli/disdrodb_run_l0.py +55 -64
  30. disdrodb/cli/disdrodb_run_l0_station.py +47 -52
  31. disdrodb/cli/disdrodb_run_l0a.py +47 -45
  32. disdrodb/cli/disdrodb_run_l0a_station.py +38 -37
  33. disdrodb/cli/disdrodb_run_l0b.py +45 -45
  34. disdrodb/cli/disdrodb_run_l0b_station.py +37 -36
  35. disdrodb/cli/disdrodb_run_l0c.py +50 -47
  36. disdrodb/cli/disdrodb_run_l0c_station.py +41 -38
  37. disdrodb/cli/disdrodb_run_l1.py +49 -45
  38. disdrodb/cli/disdrodb_run_l1_station.py +40 -37
  39. disdrodb/cli/disdrodb_run_l2e.py +50 -45
  40. disdrodb/cli/disdrodb_run_l2e_station.py +41 -37
  41. disdrodb/cli/disdrodb_run_l2m.py +49 -45
  42. disdrodb/cli/disdrodb_run_l2m_station.py +40 -37
  43. disdrodb/cli/disdrodb_run_station.py +184 -0
  44. disdrodb/cli/disdrodb_upload_archive.py +45 -35
  45. disdrodb/cli/disdrodb_upload_station.py +39 -32
  46. disdrodb/configs.py +13 -8
  47. disdrodb/constants.py +4 -2
  48. disdrodb/data_transfer/__init__.py +1 -3
  49. disdrodb/data_transfer/download_data.py +38 -54
  50. disdrodb/data_transfer/upload_data.py +1 -3
  51. disdrodb/data_transfer/zenodo.py +1 -3
  52. disdrodb/docs.py +1 -3
  53. disdrodb/etc/configs/attributes.yaml +52 -2
  54. disdrodb/etc/configs/encodings.yaml +45 -1
  55. disdrodb/etc/products/L0C/ODM470/global.yaml +5 -0
  56. disdrodb/etc/products/L0C/global.yaml +5 -0
  57. disdrodb/etc/products/L1/ODM470/global.yaml +6 -0
  58. disdrodb/etc/products/L1/global.yaml +1 -14
  59. disdrodb/etc/products/L2E/LPM/1MIN.yaml +1 -0
  60. disdrodb/etc/products/L2E/LPM/global.yaml +36 -0
  61. disdrodb/etc/products/L2E/LPM_V0/1MIN.yaml +1 -0
  62. disdrodb/etc/products/L2E/LPM_V0/global.yaml +36 -0
  63. disdrodb/etc/products/L2E/ODM470/1MIN.yaml +1 -0
  64. disdrodb/etc/products/L2E/ODM470/global.yaml +36 -0
  65. disdrodb/etc/products/L2E/PARSIVEL/1MIN.yaml +1 -0
  66. disdrodb/etc/products/L2E/PARSIVEL/global.yaml +36 -0
  67. disdrodb/etc/products/L2E/PARSIVEL2/1MIN.yaml +1 -0
  68. disdrodb/etc/products/L2E/PARSIVEL2/global.yaml +36 -0
  69. disdrodb/etc/products/L2E/PWS100/1MIN.yaml +1 -0
  70. disdrodb/etc/products/L2E/PWS100/global.yaml +36 -0
  71. disdrodb/etc/products/L2E/RD80/1MIN.yaml +19 -0
  72. disdrodb/etc/products/L2E/SWS250/1MIN.yaml +19 -0
  73. disdrodb/etc/products/L2E/global.yaml +17 -3
  74. disdrodb/etc/products/L2M/global.yaml +1 -1
  75. disdrodb/fall_velocity/__init__.py +46 -0
  76. disdrodb/fall_velocity/graupel.py +483 -0
  77. disdrodb/fall_velocity/hail.py +287 -0
  78. disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -50
  79. disdrodb/issue/__init__.py +1 -3
  80. disdrodb/issue/checks.py +3 -5
  81. disdrodb/issue/reader.py +1 -3
  82. disdrodb/issue/writer.py +1 -3
  83. disdrodb/l0/__init__.py +1 -1
  84. disdrodb/l0/check_configs.py +26 -17
  85. disdrodb/l0/check_standards.py +1 -3
  86. disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -1
  87. disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +0 -4
  88. disdrodb/l0/configs/LPM/l0b_encodings.yml +9 -9
  89. disdrodb/l0/configs/LPM/raw_data_format.yml +11 -11
  90. disdrodb/l0/configs/LPM_V0/bins_diameter.yml +103 -0
  91. disdrodb/l0/configs/LPM_V0/bins_velocity.yml +103 -0
  92. disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +45 -0
  93. disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +180 -0
  94. disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +410 -0
  95. disdrodb/l0/configs/LPM_V0/raw_data_format.yml +474 -0
  96. disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
  97. disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
  98. disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
  99. disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
  100. disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
  101. disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
  102. disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  103. disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +8 -8
  104. disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +9 -9
  105. disdrodb/l0/l0_reader.py +1 -3
  106. disdrodb/l0/l0a_processing.py +7 -5
  107. disdrodb/l0/l0b_nc_processing.py +2 -4
  108. disdrodb/l0/l0b_processing.py +27 -22
  109. disdrodb/l0/l0c_processing.py +37 -11
  110. disdrodb/l0/manuals/LPM_V0.pdf +0 -0
  111. disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
  112. disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
  113. disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
  114. disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
  115. disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
  116. disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +63 -14
  117. disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +279 -0
  118. disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +279 -0
  119. disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +3 -5
  120. disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
  121. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
  122. disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +103 -0
  123. disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +214 -0
  124. disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +206 -0
  125. disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
  126. disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
  127. disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
  128. disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
  129. disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +217 -0
  130. disdrodb/l0/readers/LPM/USA/CHARLESTON.py +227 -0
  131. disdrodb/l0/readers/{LPM → LPM_V0}/BELGIUM/ULIEGE.py +34 -52
  132. disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +240 -0
  133. disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
  134. disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
  135. disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
  136. disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
  137. disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
  138. disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
  139. disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
  140. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
  141. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
  142. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
  143. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
  144. disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
  145. disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
  146. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
  147. disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
  148. disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
  149. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
  150. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
  151. disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
  152. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
  153. disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
  154. disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
  155. disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
  156. disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
  157. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
  158. disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
  159. disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
  160. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
  161. disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
  162. disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
  163. disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
  164. disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
  165. disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +26 -14
  166. disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +2 -2
  167. disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
  168. disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
  169. disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  170. disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
  171. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  172. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
  173. disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
  174. disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
  175. disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
  176. disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -2
  177. disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
  178. disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
  179. disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
  180. disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
  181. disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
  182. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
  183. disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
  184. disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
  185. disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
  186. disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
  187. disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
  188. disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
  189. disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
  190. disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
  191. disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +155 -0
  192. disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
  193. disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
  194. disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
  195. disdrodb/l0/readers/PARSIVEL2/{NASA/GCPEX.py → KOREA/ICEPOP_UCLM.py} +51 -31
  196. disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
  197. disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +15 -8
  198. disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +9 -4
  199. disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +31 -6
  200. disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
  201. disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
  202. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  203. disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
  204. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
  205. disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
  206. disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +2 -2
  207. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
  208. disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
  209. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
  210. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  211. disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
  212. disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
  213. disdrodb/l0/readers/{PARSIVEL/NASA/PIERS.py → PARSIVEL2/NORWAY/UIB.py} +65 -31
  214. disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +7 -6
  215. disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
  216. disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
  217. disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
  218. disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
  219. disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
  220. disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +138 -0
  221. disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +49 -22
  222. disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
  223. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
  224. disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
  225. disdrodb/l0/readers/{PARSIVEL/NASA/IFLOODS.py → RD80/BRAZIL/ATTO_RD80.py} +50 -36
  226. disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
  227. disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
  228. disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
  229. disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
  230. disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
  231. disdrodb/l0/readers/{SW250 → SWS250}/BELGIUM/KMI.py +2 -4
  232. disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
  233. disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
  234. disdrodb/l0/standards.py +4 -5
  235. disdrodb/l0/template_tools.py +1 -3
  236. disdrodb/l1/__init__.py +1 -1
  237. disdrodb/l1/classification.py +913 -0
  238. disdrodb/l1/processing.py +36 -106
  239. disdrodb/l1/resampling.py +8 -3
  240. disdrodb/l1_env/__init__.py +1 -1
  241. disdrodb/l1_env/routines.py +6 -6
  242. disdrodb/l2/__init__.py +1 -1
  243. disdrodb/l2/empirical_dsd.py +61 -31
  244. disdrodb/l2/processing.py +327 -62
  245. disdrodb/metadata/checks.py +1 -3
  246. disdrodb/metadata/download.py +4 -4
  247. disdrodb/metadata/geolocation.py +1 -3
  248. disdrodb/metadata/info.py +1 -3
  249. disdrodb/metadata/manipulation.py +1 -3
  250. disdrodb/metadata/reader.py +1 -3
  251. disdrodb/metadata/search.py +1 -3
  252. disdrodb/metadata/standards.py +1 -3
  253. disdrodb/metadata/writer.py +1 -3
  254. disdrodb/physics/__init__.py +17 -0
  255. disdrodb/physics/atmosphere.py +272 -0
  256. disdrodb/physics/water.py +130 -0
  257. disdrodb/physics/wrappers.py +62 -0
  258. disdrodb/psd/__init__.py +1 -1
  259. disdrodb/psd/fitting.py +22 -9
  260. disdrodb/psd/models.py +1 -1
  261. disdrodb/routines/__init__.py +5 -1
  262. disdrodb/routines/l0.py +28 -18
  263. disdrodb/routines/l1.py +8 -6
  264. disdrodb/routines/l2.py +8 -4
  265. disdrodb/routines/options.py +116 -71
  266. disdrodb/routines/options_validation.py +728 -0
  267. disdrodb/routines/wrappers.py +431 -11
  268. disdrodb/scattering/__init__.py +1 -1
  269. disdrodb/scattering/axis_ratio.py +9 -6
  270. disdrodb/scattering/permittivity.py +8 -8
  271. disdrodb/scattering/routines.py +32 -14
  272. disdrodb/summary/__init__.py +1 -1
  273. disdrodb/summary/routines.py +146 -86
  274. disdrodb/utils/__init__.py +1 -1
  275. disdrodb/utils/archiving.py +16 -9
  276. disdrodb/utils/attrs.py +4 -3
  277. disdrodb/utils/cli.py +8 -10
  278. disdrodb/utils/compression.py +13 -13
  279. disdrodb/utils/dask.py +33 -14
  280. disdrodb/utils/dataframe.py +1 -3
  281. disdrodb/utils/decorators.py +1 -3
  282. disdrodb/utils/dict.py +1 -1
  283. disdrodb/utils/directories.py +3 -5
  284. disdrodb/utils/encoding.py +2 -4
  285. disdrodb/utils/event.py +1 -1
  286. disdrodb/utils/list.py +1 -3
  287. disdrodb/utils/logger.py +1 -3
  288. disdrodb/utils/manipulations.py +182 -6
  289. disdrodb/utils/pydantic.py +80 -0
  290. disdrodb/utils/routines.py +1 -3
  291. disdrodb/utils/subsetting.py +1 -1
  292. disdrodb/utils/time.py +3 -2
  293. disdrodb/utils/warnings.py +1 -3
  294. disdrodb/utils/writer.py +1 -3
  295. disdrodb/utils/xarray.py +30 -3
  296. disdrodb/utils/yaml.py +1 -3
  297. disdrodb/viz/__init__.py +1 -1
  298. disdrodb/viz/plots.py +197 -21
  299. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
  300. disdrodb-0.3.0.dist-info/RECORD +358 -0
  301. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
  302. disdrodb/etc/products/L1/1MIN.yaml +0 -13
  303. disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
  304. disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
  305. disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
  306. disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
  307. disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
  308. disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
  309. disdrodb/etc/products/L2M/10MIN.yaml +0 -12
  310. disdrodb/l1/beard_model.py +0 -618
  311. disdrodb/l1/filters.py +0 -203
  312. disdrodb-0.2.0.dist-info/RECORD +0 -312
  313. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
  314. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
  315. {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
disdrodb/__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/_config.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
disdrodb/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.2.0'
32
- __version_tuple__ = version_tuple = (0, 2, 0)
31
+ __version__ = version = '0.3.0'
32
+ __version_tuple__ = version_tuple = (0, 3, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -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
@@ -32,7 +32,7 @@ class DISDRODB_Base_Accessor:
32
32
  from disdrodb.api.checks import check_time
33
33
 
34
34
  if "time" in self._obj.coords:
35
- start_time = self._obj["time"].to_numpy()[0]
35
+ start_time = self._obj["time"].to_numpy().min()
36
36
  else:
37
37
  raise ValueError("Time coordinate not found")
38
38
  return check_time(start_time)
@@ -43,7 +43,7 @@ class DISDRODB_Base_Accessor:
43
43
  from disdrodb.api.checks import check_time
44
44
 
45
45
  if "time" in self._obj.coords:
46
- end_time = self._obj["time"].to_numpy()[-1]
46
+ end_time = self._obj["time"].to_numpy().max()
47
47
  else:
48
48
  raise ValueError("Time coordinate not found")
49
49
  return check_time(end_time)
@@ -64,6 +64,13 @@ class DISDRODB_Base_Accessor:
64
64
 
65
65
  return get_diameter_bin_edges(self._obj)
66
66
 
67
+ @property
68
+ def velocity_bin_edges(self):
69
+ """Return velocity bin edges."""
70
+ from disdrodb.utils.manipulations import get_velocity_bin_edges
71
+
72
+ return get_velocity_bin_edges(self._obj)
73
+
67
74
  def regularize(self):
68
75
  """Regularize timesteps."""
69
76
  from disdrodb.utils.time import regularize_dataset
@@ -93,7 +100,13 @@ class DISDRODB_Base_Accessor:
93
100
  """Plot spectrum."""
94
101
  from disdrodb.viz.plots import plot_spectrum
95
102
 
96
- plot_spectrum(self._obj, **kwargs)
103
+ return plot_spectrum(self._obj, **kwargs)
104
+
105
+ def plot_nd(self, **kwargs):
106
+ """Plot drop number concentration N(D) timeseries."""
107
+ from disdrodb.viz.plots import plot_nd
108
+
109
+ return plot_nd(self._obj, **kwargs)
97
110
 
98
111
 
99
112
  @xr.register_dataset_accessor("disdrodb")
@@ -115,17 +128,11 @@ class DISDRODB_Dataset_Accessor(DISDRODB_Base_Accessor):
115
128
  )
116
129
  return ds
117
130
 
118
- def plot_nd(self, **kwargs):
119
- """Plot drop number concentration N(D) timeseries."""
120
- from disdrodb.viz.plots import plot_nd
121
-
122
- plot_nd(self._obj, **kwargs)
123
-
124
131
  def plot_raw_and_filtered_spectra(self, **kwargs):
125
132
  """Plot the raw and filtered spectra."""
126
133
  from disdrodb.viz.plots import plot_raw_and_filtered_spectra
127
134
 
128
- plot_raw_and_filtered_spectra(self._obj, **kwargs)
135
+ return plot_raw_and_filtered_spectra(self._obj, **kwargs)
129
136
 
130
137
 
131
138
  @xr.register_dataarray_accessor("disdrodb")
disdrodb/api/checks.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
@@ -161,7 +159,7 @@ def check_temporal_resolution(temporal_resolution):
161
159
  if not isinstance(temporal_resolution, str):
162
160
  raise TypeError("'temporal_resolution' must be a string.")
163
161
  # If correct, the follow should not raise error
164
- sample_interval, rolling = get_sampling_information(temporal_resolution)
162
+ _ = get_sampling_information(temporal_resolution)
165
163
 
166
164
 
167
165
  def check_folder_partitioning(folder_partitioning):
disdrodb/api/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
@@ -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
@@ -23,7 +21,6 @@
23
21
 
24
22
  import logging
25
23
  import os
26
- import shutil
27
24
 
28
25
  from disdrodb.api.checks import (
29
26
  check_campaign_name,
@@ -46,6 +43,7 @@ from disdrodb.api.path import (
46
43
  from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
47
44
  from disdrodb.utils.directories import (
48
45
  create_directory,
46
+ remove_file_or_directories,
49
47
  remove_if_exists,
50
48
  )
51
49
 
@@ -59,7 +57,7 @@ def ensure_empty_data_dir(data_dir, force):
59
57
  """Remove the content of the data_dir directory."""
60
58
  # If force=True, remove all the directory content
61
59
  if force:
62
- shutil.rmtree(data_dir)
60
+ remove_file_or_directories(data_dir)
63
61
  # Recreate the directory
64
62
  create_directory(data_dir)
65
63
  else:
@@ -258,7 +256,7 @@ def create_logs_directory(
258
256
 
259
257
  # Ensure empty log directory
260
258
  if os.path.isdir(logs_dir):
261
- shutil.rmtree(logs_dir)
259
+ remove_file_or_directories(logs_dir)
262
260
 
263
261
  # Create logs directory
264
262
  os.makedirs(logs_dir, exist_ok=True)
disdrodb/api/info.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
disdrodb/api/io.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
@@ -19,7 +17,6 @@
19
17
  """Routines to list and open DISDRODB products."""
20
18
  import datetime
21
19
  import os
22
- import shutil
23
20
  import subprocess
24
21
  import sys
25
22
  from pathlib import Path
@@ -41,7 +38,7 @@ from disdrodb.api.path import (
41
38
  )
42
39
  from disdrodb.l0.l0_reader import define_readers_directory
43
40
  from disdrodb.utils.dict import extract_product_kwargs
44
- from disdrodb.utils.directories import list_files
41
+ from disdrodb.utils.directories import list_files, remove_file_or_directories
45
42
  from disdrodb.utils.logger import (
46
43
  log_info,
47
44
  )
@@ -338,8 +335,11 @@ def open_netcdf_files(
338
335
  import xarray as xr
339
336
 
340
337
  # Ensure variables is a list
341
- if variables is not None and isinstance(variables, str):
342
- variables = [variables]
338
+ if variables is not None:
339
+ if isinstance(variables, str):
340
+ variables = [variables]
341
+ variables = np.unique(variables).tolist()
342
+
343
343
  # Define preprocessing function for parallel opening
344
344
  preprocess = (lambda ds: ds[variables]) if parallel and variables is not None else None
345
345
 
@@ -347,6 +347,7 @@ def open_netcdf_files(
347
347
  ds = xr.open_mfdataset(
348
348
  filepaths,
349
349
  chunks=chunks,
350
+ data_vars="all",
350
351
  combine="nested",
351
352
  join="outer",
352
353
  concat_dim="time",
@@ -355,7 +356,7 @@ def open_netcdf_files(
355
356
  preprocess=preprocess,
356
357
  compat="no_conflicts",
357
358
  combine_attrs="override",
358
- coords="different", # maybe minimal?
359
+ coords="different", # maybe minimal? would remove lon/lat/alt?
359
360
  decode_timedelta=False,
360
361
  cache=False,
361
362
  autoclose=True,
@@ -363,6 +364,7 @@ def open_netcdf_files(
363
364
  )
364
365
  # - Subset variables
365
366
  if variables is not None and preprocess is None:
367
+ variables = [var for var in variables if var in ds]
366
368
  ds = ds[variables]
367
369
  # - Subset time
368
370
  if start_time is not None or end_time is not None:
@@ -475,6 +477,10 @@ def open_dataset(
475
477
  compute=compute,
476
478
  **open_kwargs,
477
479
  )
480
+
481
+ # Ensure coordinates in memory
482
+ # for coord in list(ds.coords):
483
+ # ds[coord] = ds[coord].compute()
478
484
  return ds
479
485
 
480
486
 
@@ -504,7 +510,7 @@ def remove_product(
504
510
  **product_kwargs,
505
511
  )
506
512
  log_info(logger=logger, msg="Removal of {product} files started.", verbose=verbose)
507
- shutil.rmtree(data_dir)
513
+ remove_file_or_directories(data_dir)
508
514
  log_info(logger=logger, msg="Removal of {product} files ended.", verbose=verbose)
509
515
 
510
516
 
disdrodb/api/path.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
@@ -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
@@ -34,7 +34,7 @@ sys.tracebacklimit = 0 # avoid full traceback error if occur
34
34
  help="Whether to raise error of finish the check",
35
35
  )
36
36
  def disdrodb_check_metadata_archive(metadata_archive_dir=None, raise_error=True):
37
- """Run the DISDRODB Metadata Archive Checks."""
37
+ """Validate the DISDRODB Metadata Archive."""
38
38
  from disdrodb.metadata.checks import check_metadata_archive
39
39
 
40
40
  metadata_archive_dir = parse_archive_dir(metadata_archive_dir)
@@ -0,0 +1,44 @@
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 check the validity of the DISDRODB products configuration files."""
18
+ import sys
19
+
20
+ import click
21
+
22
+ from disdrodb.utils.cli import parse_empty_string_and_none
23
+
24
+ sys.tracebacklimit = 0 # avoid full traceback error if occur
25
+
26
+ # -------------------------------------------------------------------------.
27
+ # Click Command Line Interface decorator
28
+
29
+
30
+ @click.command()
31
+ @click.option(
32
+ "--products_configs_dir",
33
+ type=str,
34
+ show_default=True,
35
+ default=None,
36
+ help="Directory with DISDRODB products configurations files",
37
+ )
38
+ def disdrodb_check_products_options(products_configs_dir):
39
+ """Validate the DISDRODB products configuration files."""
40
+ from disdrodb.routines.options_validation import validate_products_configurations
41
+
42
+ products_configs_dir = parse_empty_string_and_none(products_configs_dir)
43
+
44
+ validate_products_configurations(products_configs_dir)
@@ -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
@@ -59,27 +59,53 @@ def disdrodb_create_summary(
59
59
  data_archive_dir: Optional[str] = None,
60
60
  metadata_archive_dir: Optional[str] = None,
61
61
  ):
62
- r"""Create summary figures and tables for a specific set of DISDRODB stations.
63
-
64
- Parameters \n
65
- ---------- \n
66
- data_sources : str
67
- Name of data source(s) to process.
68
- The name(s) must be UPPER CASE.
69
- If campaign_names and station are not specified, process all stations.
70
- To specify multiple data sources, write i.e.: --data_sources 'NASA EPFL NCAR'
71
- campaign_names : str
72
- Name of the campaign(s) for which to create stations summaries.
73
- The name(s) must be UPPER CASE.
74
- To specify multiple campaigns, write i.e.: --campaign_names 'IPEX IMPACTS'
75
- station_names : str
76
- Station names.
77
- To specify multiple stations, write i.e.: --station_names 'station1 station2'
78
- data_archive_dir : str \n
79
- DISDRODB Data Archive directory \n
80
- Format: <...>/DISDRODB \n
81
- If not specified, uses path specified in the DISDRODB active configuration. \n
82
- """
62
+ """Create summary figures and tables for DISDRODB stations.
63
+
64
+ Generates summary visualizations and statistics from DISDRODB L2E data products.
65
+ The DISDRODB L2E files must be available.
66
+
67
+ \b
68
+ Station Selection:
69
+ If no station filters are specified, creates summaries for ALL available stations.
70
+ Use data_sources, campaign_names, and station_names to filter stations.
71
+ Filters work together to narrow down the selection (AND logic).
72
+
73
+ \b
74
+ Processing Options:
75
+ --parallel: Reads files in parallel for faster processing (default: False)
76
+ --temporal_resolution: Temporal resolution of L2E product to use (default: 1MIN)
77
+ Valid temporal resolutions depend on available L2E products.
78
+
79
+ \b
80
+ Archive Directories:
81
+ --data_archive_dir: Custom path to DISDRODB data archive
82
+ --metadata_archive_dir: Custom path to DISDRODB metadata archive
83
+ If not specified, paths from the active DISDRODB configuration are used
84
+
85
+ \b
86
+ Examples:
87
+ # Create summaries for all stations
88
+ disdrodb_create_summary
89
+
90
+ # Create summaries for specific data sources
91
+ disdrodb_create_summary --data_sources 'EPFL NASA'
92
+
93
+ # Create summaries for specific campaigns
94
+ disdrodb_create_summary --campaign_names 'HYMEX_LTE_SOP2 IFLOODS'
95
+
96
+ # Create summaries for specific stations with custom temporal resolution
97
+ disdrodb_create_summary --station_names 'apu01 apu02' --temporal_resolution 5MIN
98
+
99
+ # Create summaries with custom archive directory
100
+ disdrodb_create_summary --data_sources EPFL --data_archive_dir /path/to/DISDRODB
101
+
102
+ \b
103
+ Important Notes:
104
+ - Data source names must be in UPPER CASE
105
+ - Campaign names must be in UPPER CASE
106
+ - To specify multiple values, use space-separated strings in quotes
107
+ - Requires L2E data products to be available for the selected stations
108
+ """ # noqa: D301
83
109
  from disdrodb.routines import create_summary
84
110
  from disdrodb.utils.dask import close_dask_cluster, initialize_dask_cluster
85
111
 
@@ -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
@@ -55,23 +55,44 @@ def disdrodb_create_summary_station(
55
55
  # DISDRODB root directories
56
56
  data_archive_dir: Optional[str] = None,
57
57
  ):
58
- r"""Create summary figures and tables for a specific DISDRODB station.
59
-
60
- Parameters \n
61
- ---------- \n
62
- data_source : str \n
63
- Institution name (when campaign data spans more than 1 country),
64
- or country (when all campaigns (or sensor networks) are inside a given country).\n
65
- Must be UPPER CASE.\n
66
- campaign_name : str \n
67
- Campaign name. Must be UPPER CASE.\n
68
- station_name : str \n
69
- Station name \n
70
- data_archive_dir : str \n
71
- DISDRODB Data Archive directory \n
72
- Format: <...>/DISDRODB \n
73
- If not specified, uses path specified in the DISDRODB active configuration. \n
74
- """
58
+ """Create summary figures and tables for a specific DISDRODB station.
59
+
60
+ Generates summary visualizations and statistics using the DISDRODB L2E product
61
+ of the specified station.
62
+
63
+ \b
64
+ Station Specification:
65
+ Requires exact specification of data_source, campaign_name, and station_name.
66
+ All three parameters must be provided and are case-sensitive (UPPER CASE required).
67
+
68
+ \b
69
+ Processing Options:
70
+ --parallel: Reads files in parallel for faster processing (default: False)
71
+ --temporal_resolution: Temporal resolution of L2E product to use (default: 1MIN)
72
+ Valid temporal resolutions depend on available L2E products
73
+
74
+ \b
75
+ Archive Directory:
76
+ --data_archive_dir: Custom path to DISDRODB data archive
77
+ If not specified, the path from the active DISDRODB configuration is used
78
+
79
+ \b
80
+ Examples:
81
+ # Create summary for a specific station
82
+ disdrodb_create_summary_station EPFL HYMEX_LTE_SOP2 10
83
+
84
+ # Create summary with custom temporal resolution
85
+ disdrodb_create_summary_station EPFL HYMEX_LTE_SOP2 10 --temporal_resolution 5MIN
86
+
87
+ # Create summary with custom archive directory
88
+ disdrodb_create_summary_station NASA IFLOODS apu01 --data_archive_dir /path/to/DISDRODB
89
+
90
+ \b
91
+ Important Notes:
92
+ - Data source, campaign, and station names must be in UPPER CASE
93
+ - All three station identifiers are required (no wildcards)
94
+ - Requires L2E data products to be available for the specified station
95
+ """ # noqa: D301
75
96
  from disdrodb.summary.routines import create_station_summary
76
97
  from disdrodb.utils.dask import close_dask_cluster, initialize_dask_cluster
77
98
 
@@ -1,7 +1,5 @@
1
- #!/usr/bin/env python3
2
-
3
1
  # -----------------------------------------------------------------------------.
4
- # Copyright (c) 2021-2023 DISDRODB developers
2
+ # Copyright (c) 2021-2026 DISDRODB developers
5
3
  #
6
4
  # This program is free software: you can redistribute it and/or modify
7
5
  # it under the terms of the GNU General Public License as published by
@@ -1,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
@@ -45,29 +45,50 @@ def disdrodb_download_archive(
45
45
  metadata_archive_dir: Optional[str] = None,
46
46
  force: bool = False,
47
47
  ):
48
- """Download DISDRODB stations with the ``disdrodb_data_url`` in the metadata.
49
-
50
- Parameters
51
- ----------
52
- data_sources : str or list of str, optional
53
- Data source name (eg : EPFL).
54
- If not provided (``None``), all data sources will be downloaded.
55
- The default value is ``data_source=None``.
56
- campaign_names : str or list of str, optional
57
- Campaign name (eg : EPFL_ROOF_2012).
58
- If not provided (``None``), all campaigns will be downloaded.
59
- The default value is ``campaign_name=None``.
60
- station_names : str or list of str, optional
61
- Station name.
62
- If not provided (``None``), all stations will be downloaded.
63
- The default value is ``station_name=None``.
64
- force : bool, optional
65
- If ``True``, overwrite the already existing raw data file.
66
- The default value is ``False``.
67
- data_archive_dir : str (optional)
68
- DISDRODB Data Archive directory. Format: ``<...>/DISDRODB``.
69
- If ``None`` (the default), the disdrodb config variable ``data_archive_dir`` is used.
70
- """
48
+ """Download raw data for multiple DISDRODB stations from the DISDRODB Decentralized Data Archive.
49
+
50
+ It downloads station raw data files and stores them in the local DISDRODB Data Archive.
51
+ The data are organized by data_source, campaign_name, and station_name.
52
+
53
+ \b
54
+ Station Selection:
55
+ If no station filters are specified, downloads ALL stations.
56
+ Use data_sources, campaign_names, and station_names to filter stations.
57
+ Filters work together to narrow down the selection (AND logic).
58
+ Only stations with a ``disdrodb_data_url`` in their metadata will be downloaded.
59
+
60
+ \b
61
+ Download Behavior:
62
+ For webserver/FTP-hosted data:
63
+ - Incremental downloads: Fetch only new files when they become available
64
+ - Existing files on disk are skipped unless '--force True' is used
65
+
66
+ For repository-hosted data (e.g., Zenodo):
67
+ - Use '--force True' to download new versions when available
68
+ - Without '--force True', download is skipped if data already exists locally
69
+
70
+ \b
71
+ Download Options:
72
+ --force: Removes existing raw data files and forces complete re-download (default: False)
73
+ Warning: All existing station data will be deleted before re-downloading
74
+
75
+ \b
76
+ Archive Directories:
77
+ --data_archive_dir: Custom path to DISDRODB data archive
78
+ --metadata_archive_dir: Custom path to DISDRODB metadata archive
79
+ If not specified, paths from the active DISDRODB configuration are used
80
+
81
+ \b
82
+ Examples:
83
+ # Download all stations with available download URLs
84
+ disdrodb_download_archive
85
+
86
+ # Download all stations from specific data sources
87
+ disdrodb_download_archive --data_sources 'EPFL NASA'
88
+
89
+ # Download specific campaigns and force re-download
90
+ disdrodb_download_archive --campaign_names 'HYMEX_LTE_SOP2 IFLOODS' --force True
91
+ """ # noqa: D301
71
92
  from disdrodb.data_transfer.download_data import download_archive
72
93
 
73
94
  data_archive_dir = parse_archive_dir(data_archive_dir)
@@ -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
@@ -16,6 +16,7 @@
16
16
  # -----------------------------------------------------------------------------.
17
17
  """Routine to download the DISDRODB Metadata Data Archive."""
18
18
  import sys
19
+ from pathlib import Path
19
20
 
20
21
  import click
21
22
 
@@ -25,7 +26,7 @@ sys.tracebacklimit = 0 # avoid full traceback error if occur
25
26
 
26
27
 
27
28
  @click.command()
28
- @click.argument("directory_path", metavar="<station>")
29
+ @click.argument("directory_path", required=False, metavar="[directory]", type=click.Path())
29
30
  @click.option("-f", "--force", type=bool, show_default=True, default=False, help="Force overwriting")
30
31
  def disdrodb_download_metadata_archive(
31
32
  directory_path,
@@ -33,21 +34,31 @@ def disdrodb_download_metadata_archive(
33
34
  ):
34
35
  """Download the DISDRODB Metadata Archive to the specified directory.
35
36
 
36
- Parameters
37
- ----------
38
- directory_path : str
39
- The directory path where the DISDRODB-METADATA directory will be downloaded.
40
- force : bool, optional
41
- If ``True``, the existing DISDRODB-METADATA directory will be removed
42
- and a new one will be downloaded. The default value is ``False``.
43
-
44
- Returns
45
- -------
46
- metadata_archive_dir
47
- The DISDRODB Metadata Archive directory path.
48
- """
37
+ \b
38
+ Download Options:
39
+ '--force True' removes the existing DISDRODB-METADATA directory and forces re-download.
40
+ The default is --force False. If the DISDRODB-METADATA directory already exists, it raises an error.
41
+
42
+ \b
43
+ Examples:
44
+ # Download metadata archive to current directory
45
+ disdrodb_download_metadata_archive
46
+
47
+ # Download to specific directory
48
+ disdrodb_download_metadata_archive /path/to/directory
49
+
50
+ # Force re-download of existing metadata archive
51
+ disdrodb_download_metadata_archive /path/to/directory --force True
52
+
53
+ \b
54
+ Important Notes:
55
+ - Use --force with caution as it will delete the existing metadata archive
56
+ """ # noqa: D301
49
57
  from disdrodb import download_metadata_archive
50
58
 
51
- directory_path = parse_archive_dir(directory_path)
59
+ # Default to current directory if none provided
60
+ directory_path = Path(directory_path or ".").resolve()
61
+ directory_path = parse_archive_dir(str(directory_path))
52
62
 
63
+ # Download metadata archive
53
64
  download_metadata_archive(directory_path, force=force)