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
@@ -0,0 +1,106 @@
1
+ precipitation_rate:
2
+ dtype: float32
3
+ zlib: true
4
+ complevel: 3
5
+ shuffle: true
6
+ fletcher32: false
7
+ contiguous: false
8
+ chunksizes: 43200
9
+ precip_flag:
10
+ dtype: int8
11
+ zlib: true
12
+ complevel: 3
13
+ shuffle: true
14
+ fletcher32: false
15
+ contiguous: false
16
+ chunksizes: 43200
17
+ _FillValue: 127
18
+ reference_voltage:
19
+ dtype: float32
20
+ zlib: true
21
+ complevel: 3
22
+ shuffle: true
23
+ fletcher32: false
24
+ contiguous: false
25
+ chunksizes: 43200
26
+ weather_code_synop_4677:
27
+ dtype: uint8
28
+ zlib: true
29
+ complevel: 3
30
+ shuffle: true
31
+ fletcher32: false
32
+ contiguous: false
33
+ chunksizes: 5000
34
+ _FillValue: 255
35
+ relative_wind_speed:
36
+ dtype: uint16
37
+ scale_factor: 0.1
38
+ add_offset: -99.9
39
+ zlib: true
40
+ complevel: 3
41
+ shuffle: true
42
+ fletcher32: false
43
+ contiguous: false
44
+ _FillValue: 65535
45
+ chunksizes: 43200
46
+ relative_wind_direction:
47
+ dtype: uint16
48
+ zlib: true
49
+ complevel: 3
50
+ shuffle: true
51
+ fletcher32: false
52
+ contiguous: false
53
+ _FillValue: 65535
54
+ chunksizes: 43200
55
+ raw_drop_number:
56
+ dtype: uint16
57
+ zlib: true
58
+ complevel: 3
59
+ shuffle: true
60
+ fletcher32: false
61
+ contiguous: false
62
+ _FillValue: 65535
63
+ chunksizes:
64
+ - 43200
65
+ - 128
66
+ air_temperature:
67
+ dtype: uint16
68
+ scale_factor: 0.1
69
+ add_offset: -99.9
70
+ zlib: true
71
+ complevel: 3
72
+ shuffle: true
73
+ fletcher32: false
74
+ contiguous: false
75
+ _FillValue: 65535
76
+ chunksizes: 43200
77
+ relative_humidity:
78
+ dtype: uint16
79
+ scale_factor: 0.01
80
+ zlib: true
81
+ complevel: 3
82
+ shuffle: true
83
+ fletcher32: false
84
+ contiguous: false
85
+ _FillValue: 65535
86
+ chunksizes: 43200
87
+ wind_speed:
88
+ dtype: uint16
89
+ scale_factor: 0.1
90
+ add_offset: -99.9
91
+ zlib: true
92
+ complevel: 3
93
+ shuffle: true
94
+ fletcher32: false
95
+ contiguous: false
96
+ _FillValue: 65535
97
+ chunksizes: 43200
98
+ wind_direction:
99
+ dtype: uint16
100
+ zlib: true
101
+ complevel: 3
102
+ shuffle: true
103
+ fletcher32: false
104
+ contiguous: false
105
+ _FillValue: 65535
106
+ chunksizes: 43200
@@ -0,0 +1,111 @@
1
+ precipitation_rate:
2
+ n_digits: 6
3
+ n_characters: 7
4
+ n_decimals: 3
5
+ n_naturals: 3
6
+ data_range:
7
+ - 0.0
8
+ - 999.999
9
+ nan_flags: null
10
+ field_number: "1"
11
+ reference_voltage:
12
+ n_digits: 6
13
+ n_characters: 7
14
+ n_decimals: 3
15
+ n_naturals: 3
16
+ data_range:
17
+ - 0.0
18
+ - 5.5
19
+ nan_flags: null
20
+ field_number: "2"
21
+ relative_wind_speed:
22
+ n_digits: 6
23
+ n_characters: 7
24
+ n_decimals: 3
25
+ n_naturals: 3
26
+ data_range:
27
+ - 0.0
28
+ - 100
29
+ nan_flags: null
30
+ field_number: "3"
31
+ relative_wind_direction:
32
+ n_digits: 6
33
+ n_characters: 7
34
+ n_decimals: 3
35
+ n_naturals: 3
36
+ data_range:
37
+ - 0.0
38
+ - 360
39
+ nan_flags: null
40
+ field_number: "4"
41
+ precip_flag:
42
+ n_digits: 1
43
+ n_characters: 1
44
+ n_decimals: 0
45
+ n_naturals: 0
46
+ data_range:
47
+ - -1
48
+ - 5
49
+ nan_flags: null
50
+ field_number: "5"
51
+ weather_code_synop_4677:
52
+ n_digits: 2
53
+ n_characters: 2
54
+ n_decimals: 0
55
+ n_naturals: 2
56
+ data_range:
57
+ - 0
58
+ - 90
59
+ nan_flags: null
60
+ field_number: "6"
61
+ raw_drop_number:
62
+ n_digits: 1317
63
+ n_characters: 1756
64
+ n_decimals: 1317
65
+ n_naturals: 0
66
+ data_range: null
67
+ nan_flags: null
68
+ dimension_order:
69
+ - diameter_bin_center
70
+ n_values: 128
71
+ field_number: "81"
72
+ air_temperature:
73
+ n_digits: 4
74
+ n_characters: 5
75
+ n_decimals: 1
76
+ n_naturals: 2
77
+ data_range:
78
+ - -40
79
+ - 70
80
+ nan_flags: 99999
81
+ field_number: "521"
82
+ relative_humidity:
83
+ n_digits: 5
84
+ n_characters: 5
85
+ n_decimals: 0
86
+ n_naturals: 5
87
+ data_range:
88
+ - 0
89
+ - 99999
90
+ nan_flags: 99999
91
+ field_number: "522"
92
+ wind_speed:
93
+ n_digits: 3
94
+ n_characters: 4
95
+ n_decimals: 1
96
+ n_naturals: 2
97
+ data_range:
98
+ - 0
99
+ - 60
100
+ nan_flags: null
101
+ field_number: "523"
102
+ wind_direction:
103
+ n_digits: 3
104
+ n_characters: 3
105
+ n_decimals: 0
106
+ n_naturals: 3
107
+ data_range:
108
+ - 0
109
+ - 360
110
+ nan_flags: 999
111
+ field_number: "524"
@@ -121,7 +121,7 @@ reflectivity_16bit:
121
121
  raw_drop_concentration:
122
122
  description: Particle number concentrations per diameter class
123
123
  long_name: Raw drop concentration
124
- units: 1/(m3*mm)
124
+ units: log10 1/(m3*mm)
125
125
  raw_drop_average_velocity:
126
126
  description: Average particle velocities for each diameter class
127
127
  long_name: Raw drop average velocity
@@ -6,7 +6,7 @@ rainfall_rate_32bit:
6
6
  data_range:
7
7
  - 0
8
8
  - 9999.999
9
- nan_flags: null
9
+ nan_flags: 9999.999
10
10
  field_number: "01"
11
11
  rainfall_accumulated_32bit:
12
12
  n_digits: 6
@@ -16,7 +16,7 @@ rainfall_accumulated_32bit:
16
16
  data_range:
17
17
  - 0
18
18
  - 9999.0
19
- nan_flags: null
19
+ nan_flags: 9999.0
20
20
  field_number: "02"
21
21
  weather_code_synop_4680:
22
22
  n_digits: 2
@@ -62,7 +62,7 @@ reflectivity_32bit:
62
62
  data_range:
63
63
  - -9.999
64
64
  - 99.999
65
- nan_flags: null
65
+ nan_flags: 99.999
66
66
  field_number: "07"
67
67
  mor_visibility:
68
68
  n_digits: 4
@@ -92,7 +92,7 @@ laser_amplitude:
92
92
  data_range:
93
93
  - 0
94
94
  - 99999
95
- nan_flags: null
95
+ nan_flags: 99999
96
96
  field_number: "10"
97
97
  number_particles:
98
98
  n_digits: 5
@@ -102,7 +102,7 @@ number_particles:
102
102
  data_range:
103
103
  - 0
104
104
  - 99999
105
- nan_flags: null
105
+ nan_flags: 99999
106
106
  field_number: "11"
107
107
  sensor_temperature:
108
108
  n_digits: 3
@@ -221,7 +221,7 @@ rainfall_amount_absolute_32bit:
221
221
  data_range:
222
222
  - 0
223
223
  - 999.999
224
- nan_flags: null
224
+ nan_flags: 999.999
225
225
  field_number: "24"
226
226
  error_code:
227
227
  n_digits: 3
@@ -245,7 +245,7 @@ rainfall_rate_16bit:
245
245
  data_range:
246
246
  - 0
247
247
  - 9999.999
248
- nan_flags: null
248
+ nan_flags: 9999.999
249
249
  field_number: "30"
250
250
  rainfall_rate_12bit:
251
251
  n_digits: 5
@@ -273,7 +273,7 @@ reflectivity_16bit:
273
273
  data_range:
274
274
  - -9.99
275
275
  - 99.99
276
- nan_flags: null
276
+ nan_flags: 99.99
277
277
  field_number: "33"
278
278
  raw_drop_concentration:
279
279
  n_digits: 0
@@ -6,7 +6,7 @@ rainfall_rate_32bit:
6
6
  data_range:
7
7
  - 0
8
8
  - 9999.999
9
- nan_flags: null
9
+ nan_flags: 9999.999
10
10
  field_number: "01"
11
11
  rainfall_accumulated_32bit:
12
12
  n_digits: 6
@@ -16,7 +16,7 @@ rainfall_accumulated_32bit:
16
16
  data_range:
17
17
  - 0
18
18
  - 9999.0
19
- nan_flags: null
19
+ nan_flags: 9999.0
20
20
  field_number: "02"
21
21
  weather_code_synop_4680:
22
22
  n_digits: 2
@@ -62,7 +62,7 @@ reflectivity_32bit:
62
62
  data_range:
63
63
  - -9.999
64
64
  - 99.999
65
- nan_flags: null
65
+ nan_flags: 99.999
66
66
  field_number: "07"
67
67
  mor_visibility:
68
68
  n_digits: 5
@@ -92,7 +92,7 @@ laser_amplitude:
92
92
  data_range:
93
93
  - 0
94
94
  - 99999
95
- nan_flags: null
95
+ nan_flags: 99999
96
96
  field_number: "10"
97
97
  number_particles:
98
98
  n_digits: 5
@@ -102,7 +102,7 @@ number_particles:
102
102
  data_range:
103
103
  - 0
104
104
  - 99999
105
- nan_flags: null
105
+ nan_flags: 99999
106
106
  field_number: "11"
107
107
  sensor_temperature:
108
108
  n_digits: 3
@@ -221,7 +221,7 @@ rainfall_amount_absolute_32bit:
221
221
  data_range:
222
222
  - 0
223
223
  - 999.999
224
- nan_flags: null
224
+ nan_flags: 999.999
225
225
  field_number: "24"
226
226
  error_code:
227
227
  n_digits: 3
@@ -305,7 +305,7 @@ reflectivity_16bit:
305
305
  data_range:
306
306
  - -9.99
307
307
  - 99.99
308
- nan_flags: null
308
+ nan_flags: 99.99
309
309
  field_number: "33"
310
310
  rain_kinetic_energy:
311
311
  n_digits: 6
@@ -315,7 +315,7 @@ rain_kinetic_energy:
315
315
  data_range:
316
316
  - 0
317
317
  - 9999.99
318
- nan_flags: null
318
+ nan_flags: 9999.99
319
319
  field_number: "34"
320
320
  snowfall_rate:
321
321
  n_digits: 6
@@ -325,7 +325,7 @@ snowfall_rate:
325
325
  data_range:
326
326
  - 0
327
327
  - 999.999
328
- nan_flags: null
328
+ nan_flags: 999.999
329
329
  field_number: "35"
330
330
  number_particles_all:
331
331
  n_digits: 8
disdrodb/l0/l0_reader.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
@@ -267,8 +265,8 @@ def remove_issue_timesteps(df, issue_dict, logger=None, verbose=False):
267
265
  n_initial_rows = len(df)
268
266
 
269
267
  # Retrieve timesteps and time_periods
270
- timesteps = issue_dict.get("timesteps", None)
271
- time_periods = issue_dict.get("time_periods", None)
268
+ timesteps = issue_dict.get("timesteps")
269
+ time_periods = issue_dict.get("time_periods")
272
270
  timesteps = [] if timesteps is None else timesteps
273
271
  time_periods = [] if time_periods is None else time_periods
274
272
 
@@ -615,6 +613,10 @@ def sanitize_df(
615
613
  # - Strip first and last delimiter from the raw arrays
616
614
  df = strip_delimiter_from_raw_arrays(df)
617
615
 
616
+ # - Ensure raw drop number variable max value is < 999
617
+ # - Raise error otherwise
618
+ # TODO:
619
+
618
620
  # - Remove corrupted rows
619
621
  df = remove_corrupted_rows(df)
620
622
 
@@ -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,7 +48,7 @@ def _check_dict_names_validity(dict_names, sensor_name):
50
48
  keys = np.array(list(dict_names.keys()))
51
49
  values = np.array(list(dict_names.values()))
52
50
  # Get invalid keys
53
- invalid_keys = keys[np.isin(values, valid_names, invert=True)]
51
+ invalid_keys = keys[np.isin(values, valid_names, invert=True)].tolist()
54
52
  if len(invalid_keys) > 0:
55
53
  # Report invalid keys and raise error
56
54
  invalid_dict = {k: dict_names[k] for k in invalid_keys}
@@ -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
@@ -91,7 +89,7 @@ def format_string_array(string: str, n_values: int) -> np.array:
91
89
 
92
90
  e.g. : format_string_array("2,44,22,33", 4) will return [ 2. 44. 22. 33.]
93
91
 
94
- If empty string ("") --> Return an arrays of zeros
92
+ If empty string ("") or "" --> Return an arrays of zeros
95
93
  If the list length is not n_values -> Return an arrays of np.nan
96
94
 
97
95
  The function strip potential delimiters at start and end before splitting.
@@ -108,31 +106,38 @@ def format_string_array(string: str, n_values: int) -> np.array:
108
106
  np.array
109
107
  array of float
110
108
  """
111
- split_str = infer_split_str(string)
112
- values = np.array(string.strip(split_str).split(split_str))
113
-
114
- # -------------------------------------------------------------------------.
115
- ## Assumptions !!!
116
- # If empty list --> Assume no precipitation recorded. Return an arrays of zeros
117
- if len(values) == 0:
109
+ # Check for empty string or "0" case
110
+ # - Assume no precipitation recorded. Return an arrays of zeros
111
+ if string in {"", "0"}:
118
112
  values = np.zeros(n_values)
119
113
  return values
120
114
 
121
- # -------------------------------------------------------------------------.
115
+ # Check for NaN case
116
+ # - Assume no data available. Return an arrays of NaN
117
+ if string == "NaN":
118
+ values = np.zeros(n_values) * np.nan
119
+ return values
120
+
121
+ # Retrieve list of values
122
+ split_str = infer_split_str(string)
123
+ values = np.array(string.strip(split_str).split(split_str))
124
+
122
125
  # If the length is not as expected --> Assume data corruption
123
126
  # --> Return an array with nan
124
127
  if len(values) != n_values:
125
128
  values = np.zeros(n_values) * np.nan
126
- else:
127
- # Ensure string type
128
- values = values.astype("str")
129
- # Replace '' with 0
130
- values = replace_empty_strings_with_zeros(values)
131
- # Replace "-9.999" with 0
132
- values = np.char.replace(values, "-9.999", "0")
133
- # Cast values to float type
134
- # --> Note: the disk encoding is specified in the l0b_encodings.yml
135
- values = values.astype(float)
129
+ return values
130
+
131
+ # Otherwise sanitize the list of value
132
+ # Ensure string type
133
+ values = values.astype("str")
134
+ # Replace '' with 0
135
+ values = replace_empty_strings_with_zeros(values)
136
+ # Replace "-9.999" with 0
137
+ values = np.char.replace(values, "-9.999", "0")
138
+ # Cast values to float type
139
+ # --> Note: the disk encoding is specified in the l0b_encodings.yml
140
+ values = values.astype(float)
136
141
  return values
137
142
 
138
143
 
@@ -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
@@ -340,6 +338,20 @@ def get_problematic_timestep_indices(timesteps, sample_interval):
340
338
  return idx_previous_missing, idx_next_missing, idx_isolated_missing
341
339
 
342
340
 
341
+ def nearest_expected_times(times, expected_times):
342
+ """Return index of nearest expected time."""
343
+ # both must be sorted ascending
344
+ idx = np.searchsorted(expected_times, times)
345
+ idx = np.clip(idx, 1, len(expected_times) - 1)
346
+
347
+ # Compare distance to the previous vs next expected time
348
+ prev = expected_times[idx - 1]
349
+ next_ = expected_times[idx]
350
+ choose_next = (times - prev) > (next_ - times)
351
+ nearest = np.where(choose_next, next_, prev)
352
+ return nearest
353
+
354
+
343
355
  def regularize_timesteps(ds, sample_interval, robust=False, add_quality_flag=True, logger=None, verbose=True):
344
356
  """Ensure timesteps match with the sample_interval.
345
357
 
@@ -364,13 +376,16 @@ def regularize_timesteps(ds, sample_interval, robust=False, add_quality_flag=Tru
364
376
  times = times.to_numpy(dtype="M8[s]")
365
377
  expected_times = expected_times.to_numpy(dtype="M8[s]")
366
378
 
379
+ # Vectorized mapping of observed times → nearest expected times
380
+ adjusted_times = nearest_expected_times(times, expected_times)
381
+
367
382
  # Map original times to the nearest expected times
368
- # Calculate the difference between original times and expected times
369
- time_deltas = np.abs(times - expected_times[:, None]).astype(int)
383
+ # # Calculate the difference between original times and expected times
384
+ # time_deltas = np.abs(times - expected_times[:, None]).astype(int)
370
385
 
371
- # Find the index of the closest expected time for each original time
372
- nearest_indices = np.argmin(time_deltas, axis=0)
373
- adjusted_times = expected_times[nearest_indices]
386
+ # # Find the index of the closest expected time for each original time
387
+ # nearest_indices = np.argmin(time_deltas, axis=0)
388
+ # adjusted_times = expected_times[nearest_indices]
374
389
 
375
390
  # Check for duplicates in adjusted times
376
391
  unique_times, counts = np.unique(adjusted_times, return_counts=True)
@@ -466,10 +481,10 @@ def regularize_timesteps(ds, sample_interval, robust=False, add_quality_flag=Tru
466
481
  # qc_flag[-1] = 0
467
482
 
468
483
  # Add time quality flag variable
469
- ds["time_qc"] = xr.DataArray(qc_flag, dims="time")
484
+ ds["qc_time"] = xr.DataArray(qc_flag, dims="time")
470
485
 
471
- # Add CF attributes for time_qc
472
- ds["time_qc"].attrs = {
486
+ # Add CF attributes for qc_time
487
+ ds["qc_time"].attrs = {
473
488
  "long_name": "time quality flag",
474
489
  "standard_name": "status_flag",
475
490
  "units": "1",
@@ -587,6 +602,7 @@ def _finalize_l0c_dataset(ds, sample_interval, sensor_name, verbose=True, logger
587
602
  ds = add_sample_interval(ds, sample_interval=sample_interval)
588
603
 
589
604
  # Regularize timesteps (for trailing seconds)
605
+ # --> This remove time encoding
590
606
  ds = regularize_timesteps(
591
607
  ds,
592
608
  sample_interval=sample_interval,
@@ -678,6 +694,16 @@ def create_l0c_datasets(
678
694
  log_info(logger=logger, msg=f"No data between {start_time} and {end_time}.", verbose=verbose)
679
695
  return {}
680
696
 
697
+ # If 1 or 2 timesteps per time block, return empty dictionary
698
+ n_timesteps = len(ds["time"])
699
+ if n_timesteps < 3:
700
+ log_info(
701
+ logger=logger,
702
+ msg=f"Only {n_timesteps} timesteps between {start_time} and {end_time}.",
703
+ verbose=verbose,
704
+ )
705
+ return {}
706
+
681
707
  # ---------------------------------------------------------------------------------------.
682
708
  # If sample interval is a dataset variable, drop timesteps with unexpected measurement intervals !
683
709
  if "sample_interval" in ds:
Binary file
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
3
+ # Copyright (c) 2021-2026 DISDRODB developers
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU General Public License as published by
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
3
+ # Copyright (c) 2021-2026 DISDRODB developers
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU General Public License as published by
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
3
+ # Copyright (c) 2021-2026 DISDRODB developers
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU General Public License as published by
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # -----------------------------------------------------------------------------.
3
- # Copyright (c) 2021-2023 DISDRODB developers
3
+ # Copyright (c) 2021-2026 DISDRODB developers
4
4
  #
5
5
  # This program is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU General Public License as published by