disdrodb 0.1.1__tar.gz → 0.1.3__tar.gz

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 (296) hide show
  1. {disdrodb-0.1.1/disdrodb.egg-info → disdrodb-0.1.3}/PKG-INFO +3 -2
  2. {disdrodb-0.1.1 → disdrodb-0.1.3}/README.md +1 -1
  3. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/__init__.py +64 -34
  4. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/_config.py +5 -4
  5. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/_version.py +16 -3
  6. disdrodb-0.1.3/disdrodb/accessor/__init__.py +20 -0
  7. disdrodb-0.1.3/disdrodb/accessor/methods.py +125 -0
  8. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/checks.py +139 -9
  9. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/configs.py +4 -2
  10. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/info.py +10 -10
  11. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/io.py +237 -18
  12. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/path.py +81 -75
  13. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/search.py +6 -6
  14. disdrodb-0.1.3/disdrodb/cli/disdrodb_create_summary_station.py +91 -0
  15. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0.py +1 -1
  16. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0_station.py +1 -1
  17. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0b.py +1 -1
  18. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0b_station.py +1 -1
  19. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0c.py +1 -1
  20. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0c_station.py +1 -1
  21. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l2e_station.py +1 -1
  22. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/configs.py +149 -4
  23. disdrodb-0.1.3/disdrodb/constants.py +61 -0
  24. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/data_transfer/download_data.py +145 -14
  25. disdrodb-0.1.3/disdrodb/etc/configs/attributes.yaml +339 -0
  26. disdrodb-0.1.3/disdrodb/etc/configs/encodings.yaml +473 -0
  27. disdrodb-0.1.3/disdrodb/etc/products/L1/global.yaml +13 -0
  28. disdrodb-0.1.3/disdrodb/etc/products/L2E/10MIN.yaml +12 -0
  29. disdrodb-0.1.3/disdrodb/etc/products/L2E/1MIN.yaml +1 -0
  30. disdrodb-0.1.3/disdrodb/etc/products/L2E/global.yaml +22 -0
  31. disdrodb-0.1.3/disdrodb/etc/products/L2M/10MIN.yaml +12 -0
  32. disdrodb-0.1.3/disdrodb/etc/products/L2M/GAMMA_ML.yaml +8 -0
  33. disdrodb-0.1.3/disdrodb/etc/products/L2M/NGAMMA_GS_LOG_ND_MAE.yaml +6 -0
  34. disdrodb-0.1.3/disdrodb/etc/products/L2M/NGAMMA_GS_ND_MAE.yaml +6 -0
  35. disdrodb-0.1.3/disdrodb/etc/products/L2M/NGAMMA_GS_Z_MAE.yaml +6 -0
  36. disdrodb-0.1.3/disdrodb/etc/products/L2M/global.yaml +26 -0
  37. {disdrodb-0.1.1/disdrodb/scattering → disdrodb-0.1.3/disdrodb/l0}/__init__.py +11 -9
  38. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/LPM/bins_diameter.yml +3 -3
  39. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +4 -4
  40. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
  41. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL/l0b_encodings.yml +3 -3
  42. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +1 -1
  43. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL2/l0a_encodings.yml +4 -0
  44. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL2/l0b_cf_attrs.yml +20 -4
  45. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL2/l0b_encodings.yml +44 -3
  46. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +41 -1
  47. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PWS100/l0b_cf_attrs.yml +4 -4
  48. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PWS100/raw_data_format.yml +1 -1
  49. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/l0a_processing.py +30 -30
  50. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/l0b_nc_processing.py +108 -2
  51. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/l0b_processing.py +4 -4
  52. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/l0c_processing.py +5 -13
  53. disdrodb-0.1.3/disdrodb/l0/manuals/SWS250.pdf +0 -0
  54. disdrodb-0.1.3/disdrodb/l0/manuals/VPF730.pdf +0 -0
  55. disdrodb-0.1.3/disdrodb/l0/manuals/VPF750.pdf +0 -0
  56. disdrodb-0.1.3/disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +66 -0
  57. disdrodb-0.1.1/disdrodb/l0/readers/LPM/SLOVENIA/CRNI_VRH.py → disdrodb-0.1.3/disdrodb/l0/readers/LPM/SLOVENIA/UL.py +3 -0
  58. disdrodb-0.1.3/disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +195 -0
  59. disdrodb-0.1.1/disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py → disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL/GPM/PIERS.py +9 -8
  60. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +128 -0
  61. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
  62. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
  63. disdrodb-0.1.1/disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py → disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +13 -34
  64. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +165 -0
  65. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +69 -0
  66. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +310 -0
  67. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +525 -0
  68. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -1
  69. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +106 -0
  70. {disdrodb-0.1.1/disdrodb/l0/readers/PARSIVEL → disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2}/KIT/BURKINA_FASO.py +1 -1
  71. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +123 -0
  72. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +120 -0
  73. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +139 -0
  74. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
  75. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +126 -0
  76. disdrodb-0.1.1/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py → disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +25 -12
  77. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
  78. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +169 -0
  79. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +69 -0
  80. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +144 -0
  81. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +201 -0
  82. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +137 -0
  83. disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL2/USA/C3WE.py +146 -0
  84. disdrodb-0.1.3/disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +156 -0
  85. disdrodb-0.1.1/disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py → disdrodb-0.1.3/disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +16 -15
  86. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +31 -14
  87. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/routines.py +105 -14
  88. {disdrodb-0.1.1/disdrodb/l0 → disdrodb-0.1.3/disdrodb/l1}/__init__.py +6 -1
  89. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1/filters.py +34 -20
  90. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1/processing.py +45 -44
  91. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1/resampling.py +77 -66
  92. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1/routines.py +35 -42
  93. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1_env/routines.py +18 -3
  94. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l2/__init__.py +7 -0
  95. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l2/empirical_dsd.py +58 -10
  96. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l2/event.py +27 -120
  97. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l2/processing.py +267 -116
  98. disdrodb-0.1.3/disdrodb/l2/routines.py +1232 -0
  99. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/standards.py +3 -1
  100. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/psd/fitting.py +463 -144
  101. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/psd/models.py +8 -5
  102. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/routines.py +3 -3
  103. disdrodb-0.1.3/disdrodb/scattering/__init__.py +40 -0
  104. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/scattering/axis_ratio.py +56 -36
  105. disdrodb-0.1.3/disdrodb/scattering/permittivity.py +486 -0
  106. disdrodb-0.1.3/disdrodb/scattering/routines.py +998 -0
  107. {disdrodb-0.1.1/disdrodb/l1 → disdrodb-0.1.3/disdrodb/summary}/__init__.py +1 -1
  108. disdrodb-0.1.3/disdrodb/summary/routines.py +4120 -0
  109. disdrodb-0.1.3/disdrodb/utils/attrs.py +151 -0
  110. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/compression.py +30 -1
  111. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/dask.py +59 -8
  112. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/dataframe.py +63 -9
  113. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/directories.py +49 -17
  114. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/encoding.py +33 -19
  115. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/logger.py +13 -6
  116. disdrodb-0.1.3/disdrodb/utils/manipulations.py +71 -0
  117. disdrodb-0.1.3/disdrodb/utils/subsetting.py +214 -0
  118. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/time.py +165 -19
  119. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/writer.py +20 -7
  120. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/xarray.py +85 -4
  121. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/viz/__init__.py +13 -0
  122. disdrodb-0.1.3/disdrodb/viz/plots.py +344 -0
  123. {disdrodb-0.1.1 → disdrodb-0.1.3/disdrodb.egg-info}/PKG-INFO +3 -2
  124. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb.egg-info/SOURCES.txt +46 -6
  125. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb.egg-info/entry_points.txt +1 -0
  126. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb.egg-info/requires.txt +1 -0
  127. {disdrodb-0.1.1 → disdrodb-0.1.3}/pyproject.toml +8 -1
  128. disdrodb-0.1.1/disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT.py +0 -166
  129. disdrodb-0.1.1/disdrodb/l1/encoding_attrs.py +0 -635
  130. disdrodb-0.1.1/disdrodb/l2/processing_options.py +0 -213
  131. disdrodb-0.1.1/disdrodb/l2/routines.py +0 -868
  132. disdrodb-0.1.1/disdrodb/scattering/routines.py +0 -456
  133. disdrodb-0.1.1/disdrodb/utils/attrs.py +0 -208
  134. disdrodb-0.1.1/disdrodb/viz/plots.py +0 -17
  135. {disdrodb-0.1.1 → disdrodb-0.1.3}/.codebeatignore +0 -0
  136. {disdrodb-0.1.1 → disdrodb-0.1.3}/.coveragerc +0 -0
  137. {disdrodb-0.1.1 → disdrodb-0.1.3}/.gitignore +0 -0
  138. {disdrodb-0.1.1 → disdrodb-0.1.3}/.pre-commit-config.yaml +0 -0
  139. {disdrodb-0.1.1 → disdrodb-0.1.3}/.readthedocs.yaml +0 -0
  140. {disdrodb-0.1.1 → disdrodb-0.1.3}/AUTHORS.md +0 -0
  141. {disdrodb-0.1.1 → disdrodb-0.1.3}/CHANGELOG.md +0 -0
  142. {disdrodb-0.1.1 → disdrodb-0.1.3}/CODE_OF_CONDUCT.md +0 -0
  143. {disdrodb-0.1.1 → disdrodb-0.1.3}/CONTRIBUTING.rst +0 -0
  144. {disdrodb-0.1.1 → disdrodb-0.1.3}/LICENSE +0 -0
  145. {disdrodb-0.1.1 → disdrodb-0.1.3}/MANIFEST.in +0 -0
  146. {disdrodb-0.1.1 → disdrodb-0.1.3}/Makefile +0 -0
  147. {disdrodb-0.1.1 → disdrodb-0.1.3}/SECURITY.md +0 -0
  148. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/__init__.py +0 -0
  149. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/api/create_directories.py +0 -0
  150. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_check_metadata_archive.py +0 -0
  151. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_data_archive_directory.py +0 -0
  152. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_download_archive.py +0 -0
  153. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_download_metadata_archive.py +0 -0
  154. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_download_station.py +0 -0
  155. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_initialize_station.py +0 -0
  156. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_metadata_archive_directory.py +0 -0
  157. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_open_data_archive.py +0 -0
  158. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_open_logs_directory.py +0 -0
  159. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_open_metadata_archive.py +0 -0
  160. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_open_metadata_directory.py +0 -0
  161. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_open_product_directory.py +0 -0
  162. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_open_readers_directory.py +0 -0
  163. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0a.py +0 -0
  164. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l0a_station.py +0 -0
  165. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l1.py +0 -0
  166. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l1_station.py +0 -0
  167. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l2e.py +0 -0
  168. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l2m.py +0 -0
  169. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_run_l2m_station.py +0 -0
  170. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_upload_archive.py +0 -0
  171. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/cli/disdrodb_upload_station.py +0 -0
  172. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/data_transfer/__init__.py +0 -0
  173. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/data_transfer/upload_data.py +0 -0
  174. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/data_transfer/zenodo.py +0 -0
  175. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/docs.py +0 -0
  176. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/issue/__init__.py +0 -0
  177. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/issue/checks.py +0 -0
  178. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/issue/reader.py +0 -0
  179. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/issue/writer.py +0 -0
  180. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/check_configs.py +0 -0
  181. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/check_standards.py +0 -0
  182. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/LPM/bins_velocity.yml +0 -0
  183. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -0
  184. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/LPM/l0b_encodings.yml +0 -0
  185. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/LPM/raw_data_format.yml +0 -0
  186. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL/bins_diameter.yml +0 -0
  187. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL/bins_velocity.yml +0 -0
  188. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL/l0a_encodings.yml +0 -0
  189. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL2/bins_diameter.yml +0 -0
  190. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PARSIVEL2/bins_velocity.yml +0 -0
  191. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PWS100/bins_diameter.yml +0 -0
  192. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PWS100/bins_velocity.yml +0 -0
  193. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PWS100/l0a_encodings.yml +0 -0
  194. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/PWS100/l0b_encodings.yml +0 -0
  195. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/RD80/bins_diameter.yml +0 -0
  196. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/RD80/bins_velocity.yml +0 -0
  197. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/RD80/l0a_encodings.yml +0 -0
  198. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/RD80/l0b_cf_attrs.yml +0 -0
  199. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/RD80/l0b_encodings.yml +0 -0
  200. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/configs/RD80/raw_data_format.yml +0 -0
  201. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/l0_reader.py +0 -0
  202. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/manuals/LPM.pdf +0 -0
  203. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/manuals/ODM470.pdf +0 -0
  204. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/manuals/PARSIVEL.pdf +0 -0
  205. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/manuals/PARSIVEL2.pdf +0 -0
  206. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/manuals/PWS100.pdf +0 -0
  207. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/manuals/RD80.pdf +0 -0
  208. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +0 -0
  209. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +0 -0
  210. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +0 -0
  211. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +0 -0
  212. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +0 -0
  213. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +0 -0
  214. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/KIT/CHWALA.py +0 -0
  215. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +0 -0
  216. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/LPM/UK/DIVEN.py +0 -0
  217. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +0 -0
  218. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +0 -0
  219. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +0 -0
  220. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +0 -0
  221. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +0 -0
  222. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +0 -0
  223. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +0 -0
  224. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +0 -0
  225. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +0 -0
  226. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +0 -0
  227. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +0 -0
  228. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +0 -0
  229. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +0 -0
  230. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +0 -0
  231. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +0 -0
  232. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +0 -0
  233. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +0 -0
  234. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +0 -0
  235. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +0 -0
  236. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +0 -0
  237. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +0 -0
  238. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +0 -0
  239. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +0 -0
  240. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +0 -0
  241. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +0 -0
  242. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +0 -0
  243. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +0 -0
  244. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +0 -0
  245. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +0 -0
  246. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/GPM/LPVEX.py +0 -0
  247. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +0 -0
  248. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +0 -0
  249. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +0 -0
  250. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +0 -0
  251. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +0 -0
  252. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +0 -0
  253. /disdrodb-0.1.1/disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL_FGG.py → /disdrodb-0.1.3/disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +0 -0
  254. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +0 -0
  255. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +0 -0
  256. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +0 -0
  257. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +0 -0
  258. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +0 -0
  259. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +0 -0
  260. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +0 -0
  261. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +0 -0
  262. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +0 -0
  263. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +0 -0
  264. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +0 -0
  265. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +0 -0
  266. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +0 -0
  267. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +0 -0
  268. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +0 -0
  269. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +0 -0
  270. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/__init__.py +0 -0
  271. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/template_reader_raw_netcdf_data.py +0 -0
  272. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/readers/template_reader_raw_text_data.py +0 -0
  273. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/standards.py +0 -0
  274. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l0/template_tools.py +0 -0
  275. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1/beard_model.py +0 -0
  276. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1/fall_velocity.py +0 -0
  277. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/l1_env/__init__.py +0 -0
  278. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/__init__.py +0 -0
  279. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/checks.py +0 -0
  280. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/download.py +0 -0
  281. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/geolocation.py +0 -0
  282. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/info.py +0 -0
  283. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/manipulation.py +0 -0
  284. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/reader.py +0 -0
  285. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/search.py +0 -0
  286. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/metadata/writer.py +0 -0
  287. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/psd/__init__.py +0 -0
  288. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/__init__.py +0 -0
  289. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/cli.py +0 -0
  290. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/decorators.py +0 -0
  291. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/list.py +0 -0
  292. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/warnings.py +0 -0
  293. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb/utils/yaml.py +0 -0
  294. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb.egg-info/dependency_links.txt +0 -0
  295. {disdrodb-0.1.1 → disdrodb-0.1.3}/disdrodb.egg-info/top_level.txt +0 -0
  296. {disdrodb-0.1.1 → disdrodb-0.1.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: disdrodb
3
- Version: 0.1.1
3
+ Version: 0.1.3
4
4
  Summary: disdrodb provides tools to download, standardize, share and analyze global disdrometer data.
5
5
  Author: Gionata Ghiggi
6
6
  Project-URL: homepage, https://github.com/ltelab/disdrodb
@@ -33,6 +33,7 @@ Requires-Dist: numpy
33
33
  Requires-Dist: scipy
34
34
  Requires-Dist: dask[distributed]
35
35
  Requires-Dist: xarray
36
+ Requires-Dist: matplotlib
36
37
  Provides-Extra: dev
37
38
  Requires-Dist: jupyter; extra == "dev"
38
39
  Requires-Dist: pre-commit; extra == "dev"
@@ -190,7 +191,7 @@ disdrodb_run_l2e
190
191
  disdrodb_run_l2m
191
192
  ```
192
193
 
193
- ### 💫 Analyze AnalysisReady Products
194
+ ### 💫 Analyze Analysis-Ready Products
194
195
 
195
196
  The software’s `open_dataset` function **lazily** opens all station files of a given product:
196
197
 
@@ -141,7 +141,7 @@ disdrodb_run_l2e
141
141
  disdrodb_run_l2m
142
142
  ```
143
143
 
144
- ### 💫 Analyze AnalysisReady Products
144
+ ### 💫 Analyze Analysis-Ready Products
145
145
 
146
146
  The software’s `open_dataset` function **lazily** opens all station files of a given product:
147
147
 
@@ -17,10 +17,10 @@
17
17
  """DISDRODB software."""
18
18
 
19
19
  import contextlib
20
- import importlib
21
20
  import os
22
21
  from importlib.metadata import PackageNotFoundError, version
23
22
 
23
+ import disdrodb.accessor # noqa
24
24
  from disdrodb._config import config # noqa
25
25
  from disdrodb.api.configs import available_sensor_names
26
26
  from disdrodb.api.io import (
@@ -35,11 +35,26 @@ from disdrodb.api.search import (
35
35
  available_data_sources,
36
36
  available_stations,
37
37
  )
38
- from disdrodb.configs import define_disdrodb_configs as define_configs
39
- from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
38
+ from disdrodb.configs import (
39
+ define_configs,
40
+ get_data_archive_dir,
41
+ get_metadata_archive_dir,
42
+ get_model_options,
43
+ get_product_options,
44
+ get_scattering_table_dir,
45
+ )
40
46
  from disdrodb.data_transfer.download_data import download_archive, download_station
41
47
  from disdrodb.docs import open_documentation, open_sensor_documentation
42
- from disdrodb.l0.l0_reader import available_readers, get_reader, get_station_reader
48
+ from disdrodb.l0 import (
49
+ available_readers,
50
+ generate_l0a,
51
+ generate_l0b,
52
+ generate_l0b_from_nc,
53
+ get_reader,
54
+ get_station_reader,
55
+ )
56
+ from disdrodb.l1 import generate_l1
57
+ from disdrodb.l2 import generate_l2_radar, generate_l2e, generate_l2m
43
58
  from disdrodb.metadata import download_metadata_archive, read_metadata_archive, read_station_metadata
44
59
  from disdrodb.metadata.checks import (
45
60
  check_metadata_archive,
@@ -62,22 +77,25 @@ from disdrodb.routines import (
62
77
  run_l2m,
63
78
  run_l2m_station,
64
79
  )
65
-
66
- ARCHIVE_VERSION = "V0"
67
- SOFTWARE_VERSION = "V" + importlib.metadata.version("disdrodb")
68
- CONVENTIONS = "CF-1.10, ACDD-1.3"
69
-
70
- # Define coordinates names
71
- # TODO: make it configurable
72
- DIAMETER_COORDS = ["diameter_bin_center", "diameter_bin_width", "diameter_bin_lower", "diameter_bin_upper"]
73
- VELOCITY_COORDS = ["velocity_bin_center", "velocity_bin_width", "velocity_bin_lower", "velocity_bin_upper"]
74
- VELOCITY_DIMENSION = "velocity_bin_center"
75
- DIAMETER_DIMENSION = "diameter_bin_center"
76
- OPTICAL_SENSORS = ["PARSIVEL", "PARSIVEL2", "LPM", "PWS100"]
77
- IMPACT_SENSORS = ["RD80"]
78
-
79
-
80
- PRODUCTS = ["RAW", "L0A", "L0B", "L0C", "L1", "L2E", "L2M"]
80
+ from disdrodb.utils.manipulations import convert_from_decibel as idecibel
81
+ from disdrodb.utils.manipulations import convert_to_decibel as decibel
82
+
83
+ from .constants import (
84
+ ARCHIVE_VERSION,
85
+ CONVENTIONS,
86
+ COORDINATES,
87
+ DIAMETER_COORDS,
88
+ DIAMETER_DIMENSION,
89
+ GEOLOCATION_COORDS,
90
+ IMPACT_SENSORS,
91
+ OPTICAL_SENSORS,
92
+ PRODUCTS,
93
+ PRODUCTS_ARGUMENTS,
94
+ PRODUCTS_REQUIREMENTS,
95
+ SOFTWARE_VERSION,
96
+ VELOCITY_COORDS,
97
+ VELOCITY_DIMENSION,
98
+ )
81
99
 
82
100
 
83
101
  def available_products():
@@ -85,21 +103,21 @@ def available_products():
85
103
  return PRODUCTS
86
104
 
87
105
 
88
- PRODUCTS_ARGUMENTS = {
89
- "L2E": ["rolling", "sample_interval"],
90
- "L2M": ["rolling", "sample_interval", "model_name"],
91
- }
92
-
93
- PRODUCTS_REQUIREMENTS = {
94
- "L0A": "RAW",
95
- "L0B": "L0A",
96
- "L0C": "L0B",
97
- "L1": "L0C",
98
- "L2E": "L1",
99
- "L2M": "L2E",
100
- }
101
-
102
106
  __all__ = [
107
+ "ARCHIVE_VERSION",
108
+ "CONVENTIONS",
109
+ "COORDINATES",
110
+ "DIAMETER_COORDS",
111
+ "DIAMETER_DIMENSION",
112
+ "GEOLOCATION_COORDS",
113
+ "IMPACT_SENSORS",
114
+ "OPTICAL_SENSORS",
115
+ "PRODUCTS",
116
+ "PRODUCTS_ARGUMENTS",
117
+ "PRODUCTS_REQUIREMENTS",
118
+ "SOFTWARE_VERSION",
119
+ "VELOCITY_COORDS",
120
+ "VELOCITY_DIMENSION",
103
121
  "available_campaigns",
104
122
  "available_data_sources",
105
123
  "available_readers",
@@ -108,15 +126,27 @@ __all__ = [
108
126
  "check_metadata_archive",
109
127
  "check_metadata_archive_geolocation",
110
128
  "check_station_metadata",
129
+ "decibel",
111
130
  "define_configs",
112
131
  "download_archive",
113
132
  "download_metadata_archive",
114
133
  "download_station",
115
134
  "find_files",
135
+ "generate_l0a",
136
+ "generate_l0b",
137
+ "generate_l0b_from_nc",
138
+ "generate_l1",
139
+ "generate_l2_radar",
140
+ "generate_l2e",
141
+ "generate_l2m",
116
142
  "get_data_archive_dir",
117
143
  "get_metadata_archive_dir",
144
+ "get_model_options",
145
+ "get_product_options",
118
146
  "get_reader",
147
+ "get_scattering_table_dir",
119
148
  "get_station_reader",
149
+ "idecibel",
120
150
  "open_dataset",
121
151
  "open_documentation",
122
152
  "open_logs_directory",
@@ -22,13 +22,13 @@ See https://donfig.readthedocs.io/en/latest/configuration.html for more info.
22
22
  """
23
23
  from donfig import Config
24
24
 
25
- from disdrodb.configs import read_disdrodb_configs
25
+ from disdrodb.configs import read_configs
26
26
 
27
27
 
28
- def _get_disdrodb_default_configs():
28
+ def _get_default_configs():
29
29
  """Retrieve the default DISDRODB settings from the ``.config_disdrodb.yml`` file."""
30
30
  try:
31
- config_dict = read_disdrodb_configs()
31
+ config_dict = read_configs()
32
32
  config_dict = {key: value for key, value in config_dict.items() if value is not None}
33
33
  except Exception:
34
34
  config_dict = {}
@@ -38,11 +38,12 @@ def _get_disdrodb_default_configs():
38
38
  _CONFIG_DEFAULTS = {
39
39
  "data_archive_dir": None,
40
40
  "metadata_archive_dir": None,
41
+ "scattering_table_dir": None,
41
42
  "zenodo_sandbox_token": None,
42
43
  "zenodo_token": None,
43
44
  "folder_partitioning": "year/month",
44
45
  }
45
- _CONFIG_DEFAULTS.update(_get_disdrodb_default_configs())
46
+ _CONFIG_DEFAULTS.update(_get_default_configs())
46
47
 
47
48
  _CONFIG_PATHS = []
48
49
 
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '0.1.1'
21
- __version_tuple__ = version_tuple = (0, 1, 1)
31
+ __version__ = version = '0.1.3'
32
+ __version_tuple__ = version_tuple = (0, 1, 3)
33
+
34
+ __commit_id__ = commit_id = 'g44c8701a4'
@@ -0,0 +1,20 @@
1
+ # -----------------------------------------------------------------------------.
2
+ # Copyright (c) 2021-2023 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
+ """This directory defines DISDRODB xarray accessors."""
18
+ from .methods import DISDRODB_DataArray_Accessor, DISDRODB_Dataset_Accessor
19
+
20
+ __all__ = ["DISDRODB_DataArray_Accessor", "DISDRODB_Dataset_Accessor"]
@@ -0,0 +1,125 @@
1
+ # -----------------------------------------------------------------------------.
2
+ # Copyright (c) 2021-2023 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
+ """This module defines DISDRODB xarray accessors."""
18
+ import xarray as xr
19
+
20
+
21
+ class DISDRODB_Base_Accessor:
22
+ """DISDRODB Xarray Base Accessor."""
23
+
24
+ def __init__(self, xarray_obj):
25
+ if not isinstance(xarray_obj, (xr.DataArray, xr.Dataset)):
26
+ raise TypeError("The 'gpm' accessor is available only for xarray.Dataset and xarray.DataArray.")
27
+ self._obj = xarray_obj
28
+
29
+ @property
30
+ def start_time(self):
31
+ """Return start time."""
32
+ from disdrodb.api.checks import check_time
33
+
34
+ if "time" in self._obj.coords:
35
+ start_time = self._obj["time"].to_numpy()[0]
36
+ else:
37
+ raise ValueError("Time coordinate not found")
38
+ return check_time(start_time)
39
+
40
+ @property
41
+ def end_time(self):
42
+ """Return end time."""
43
+ from disdrodb.api.checks import check_time
44
+
45
+ if "time" in self._obj.coords:
46
+ end_time = self._obj["time"].to_numpy()[-1]
47
+ else:
48
+ raise ValueError("Time coordinate not found")
49
+ return check_time(end_time)
50
+
51
+ @property
52
+ def sample_interval(self):
53
+ """Return the sample interval in seconds."""
54
+ from disdrodb.utils.time import ensure_sample_interval_in_seconds
55
+
56
+ if "sample_interval" not in self._obj.coords:
57
+ raise ValueError("The sample interval is not specified in the xarray object.")
58
+ return int(ensure_sample_interval_in_seconds(self._obj["sample_interval"].to_numpy()))
59
+
60
+ @property
61
+ def diameter_bin_edges(self):
62
+ """Return diameter bin edges."""
63
+ from disdrodb.utils.manipulations import get_diameter_bin_edges
64
+
65
+ return get_diameter_bin_edges(self._obj)
66
+
67
+ def regularize(self):
68
+ """Regularize timesteps."""
69
+ from disdrodb.utils.time import regularize_dataset
70
+
71
+ sample_interval = self._obj.disdrodb.sample_interval
72
+ return regularize_dataset(self._obj, freq=f"{sample_interval}s")
73
+
74
+ def isel(self, indexers=None, drop=False, **indexers_kwargs):
75
+ """Perform index-based dimension selection."""
76
+ from disdrodb.utils.subsetting import isel
77
+
78
+ return isel(self._obj, indexers=indexers, drop=drop, **indexers_kwargs)
79
+
80
+ def sel(self, indexers=None, drop=False, method=None, **indexers_kwargs):
81
+ """Perform value-based coordinate selection."""
82
+ from disdrodb.utils.subsetting import sel
83
+
84
+ return sel(self._obj, indexers=indexers, drop=drop, method=method, **indexers_kwargs)
85
+
86
+ def align(self, *args):
87
+ """Align DISDRODB products over time, velocity and diameter dimensions."""
88
+ from disdrodb.utils.subsetting import align
89
+
90
+ return align(self._obj, *args)
91
+
92
+
93
+ @xr.register_dataset_accessor("disdrodb")
94
+ class DISDRODB_Dataset_Accessor(DISDRODB_Base_Accessor):
95
+ """DISDRODB Xarray Dataset Accessor."""
96
+
97
+ def __init__(self, xarray_obj):
98
+ super().__init__(xarray_obj)
99
+
100
+ def resample(self, accumulation_interval, rolling=True):
101
+ """Resample a L1 or L2 DISDRODB Product."""
102
+ from disdrodb.l1.resampling import resample_dataset
103
+
104
+ sample_interval = self._obj.disdrodb.sample_interval
105
+ ds = resample_dataset(
106
+ self._obj,
107
+ sample_interval=sample_interval,
108
+ accumulation_interval=accumulation_interval,
109
+ rolling=rolling,
110
+ )
111
+ return ds
112
+
113
+ def plot_nd(self, **kwargs):
114
+ """Plot drop number concentration N(D) timeseries."""
115
+ from disdrodb.viz.plots import plot_nd
116
+
117
+ plot_nd(self._obj, **kwargs)
118
+
119
+
120
+ @xr.register_dataarray_accessor("disdrodb")
121
+ class DISDRODB_DataArray_Accessor(DISDRODB_Base_Accessor):
122
+ """DISDRODB Xarray DataArray Accessor."""
123
+
124
+ def __init__(self, xarray_obj):
125
+ super().__init__(xarray_obj)
@@ -17,9 +17,12 @@
17
17
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
18
  # -----------------------------------------------------------------------------.
19
19
  """DISDRODB Checks Functions."""
20
+ import datetime
21
+ import difflib
20
22
  import logging
21
23
  import os
22
24
  import re
25
+ import sys
23
26
  import warnings
24
27
 
25
28
  import numpy as np
@@ -30,8 +33,10 @@ from disdrodb.api.path import (
30
33
  define_issue_filepath,
31
34
  define_metadata_filepath,
32
35
  )
36
+ from disdrodb.constants import PRODUCTS, PRODUCTS_ARGUMENTS
33
37
  from disdrodb.utils.directories import (
34
38
  ensure_string_path,
39
+ list_directories,
35
40
  list_files,
36
41
  )
37
42
 
@@ -83,7 +88,7 @@ def check_path_is_a_directory(dir_path, path_name=""):
83
88
 
84
89
  def check_directories_inside(dir_path):
85
90
  """Check there are directories inside the specified ``dir_path``."""
86
- dir_paths = os.listdir(dir_path)
91
+ dir_paths = list_directories(dir_path, recursive=False)
87
92
  if len(dir_paths) == 0:
88
93
  raise ValueError(f"There are not directories within {dir_path}")
89
94
 
@@ -106,6 +111,15 @@ def check_metadata_archive_dir(metadata_archive_dir: str):
106
111
  return metadata_archive_dir
107
112
 
108
113
 
114
+ def check_scattering_table_dir(scattering_table_dir: str):
115
+ """Raise an error if the directory does not exist."""
116
+ scattering_table_dir = str(scattering_table_dir) # convert Pathlib to string
117
+ scattering_table_dir = os.path.normpath(scattering_table_dir)
118
+ if not os.path.exists(scattering_table_dir):
119
+ raise ValueError(f"The DISDRODB T-Matrix scattering tables directory {scattering_table_dir} does not exists.")
120
+ return scattering_table_dir
121
+
122
+
109
123
  def check_measurement_interval(measurement_interval):
110
124
  """Check measurement interval validity."""
111
125
  if isinstance(measurement_interval, str) and measurement_interval == "":
@@ -216,8 +230,6 @@ def check_data_source(data_source):
216
230
 
217
231
  def check_product(product):
218
232
  """Check DISDRODB product."""
219
- from disdrodb import PRODUCTS
220
-
221
233
  if not isinstance(product, str):
222
234
  raise TypeError("`product` must be a string.")
223
235
  valid_products = PRODUCTS
@@ -248,8 +260,6 @@ def check_product_kwargs(product, product_kwargs):
248
260
  ValueError
249
261
  If required arguments are missing or if there are unexpected extra arguments.
250
262
  """
251
- from disdrodb import PRODUCTS_ARGUMENTS
252
-
253
263
  required = set(PRODUCTS_ARGUMENTS.get(product, []))
254
264
  provided = set(product_kwargs.keys())
255
265
  missing = required - provided
@@ -267,8 +277,6 @@ def check_product_kwargs(product, product_kwargs):
267
277
 
268
278
  def select_required_product_kwargs(product, product_kwargs):
269
279
  """Select the required product arguments."""
270
- from disdrodb import PRODUCTS_ARGUMENTS
271
-
272
280
  required = set(PRODUCTS_ARGUMENTS.get(product, []))
273
281
  provided = set(product_kwargs.keys())
274
282
  missing = required - provided
@@ -368,11 +376,50 @@ def has_available_data(
368
376
  return False
369
377
 
370
378
  # If no files, return False
371
- filepaths = list_files(data_dir, glob_pattern="*", recursive=True)
379
+ filepaths = list_files(data_dir, recursive=True)
372
380
  nfiles = len(filepaths)
373
381
  return nfiles >= 1
374
382
 
375
383
 
384
+ def check_station_inputs(
385
+ data_source,
386
+ campaign_name,
387
+ station_name,
388
+ metadata_archive_dir=None,
389
+ ):
390
+ """Check validity of stations inputs."""
391
+ import disdrodb
392
+
393
+ # Check data source
394
+ valid_data_sources = disdrodb.available_data_sources(metadata_archive_dir=metadata_archive_dir)
395
+ if data_source not in valid_data_sources:
396
+ matches = difflib.get_close_matches(data_source, valid_data_sources, n=1, cutoff=0.4)
397
+ suggestion = f"Did you mean '{matches[0]}'?" if matches else ""
398
+ raise ValueError(f"DISDRODB does not include a data source named {data_source}. {suggestion}")
399
+ # Check campaign name
400
+ valid_campaigns = disdrodb.available_campaigns(data_sources=data_source, metadata_archive_dir=metadata_archive_dir)
401
+ if campaign_name not in valid_campaigns:
402
+ matches = difflib.get_close_matches(campaign_name, valid_campaigns, n=1, cutoff=0.4)
403
+ suggestion = f"Did you mean campaign '{matches[0]}' ?" if matches else ""
404
+ raise ValueError(
405
+ f"The {data_source} data source does not include a campaign named {campaign_name}. {suggestion}",
406
+ )
407
+
408
+ # Check station name
409
+ valid_stations = disdrodb.available_stations(
410
+ data_sources=data_source,
411
+ campaign_names=campaign_name,
412
+ metadata_archive_dir=metadata_archive_dir,
413
+ return_tuple=False,
414
+ )
415
+ if station_name not in valid_stations:
416
+ matches = difflib.get_close_matches(station_name, valid_stations, n=1, cutoff=0.4)
417
+ suggestion = f"Did you mean station '{matches[0]}'?" if matches else ""
418
+ raise ValueError(
419
+ f"The {data_source} {campaign_name} campaign does not have a station named {station_name}. {suggestion}",
420
+ )
421
+
422
+
376
423
  def check_data_availability(
377
424
  product,
378
425
  data_source,
@@ -412,7 +459,6 @@ def check_metadata_file(metadata_archive_dir, data_source, campaign_name, statio
412
459
  f"The metadata YAML file of {data_source} {campaign_name} {station_name} does not exist at"
413
460
  f" {metadata_filepath}."
414
461
  )
415
- logger.error(msg)
416
462
  raise ValueError(msg)
417
463
 
418
464
  # Check validity
@@ -475,3 +521,87 @@ def check_issue_file(data_source, campaign_name, station_name, metadata_archive_
475
521
  station_name=station_name,
476
522
  )
477
523
  return issue_filepath
524
+
525
+
526
+ def check_filepaths(filepaths):
527
+ """Ensure filepaths is a list of string."""
528
+ if isinstance(filepaths, str):
529
+ filepaths = [filepaths]
530
+ if not isinstance(filepaths, list):
531
+ raise TypeError("Expecting a list of filepaths.")
532
+ return filepaths
533
+
534
+
535
+ def get_current_utc_time():
536
+ """Get current UTC time."""
537
+ if sys.version_info >= (3, 11):
538
+ return datetime.datetime.now(datetime.UTC).replace(tzinfo=None)
539
+ return datetime.datetime.utcnow()
540
+
541
+
542
+ def check_start_end_time(start_time, end_time):
543
+ """Check start_time and end_time value validity."""
544
+ start_time = check_time(start_time)
545
+ end_time = check_time(end_time)
546
+
547
+ # Check start_time and end_time are chronological
548
+ if start_time > end_time:
549
+ raise ValueError("Provide 'start_time' occurring before of 'end_time'.")
550
+ # Check start_time and end_time are in the past
551
+ if start_time > get_current_utc_time():
552
+ raise ValueError("Provide 'start_time' occurring in the past.")
553
+ if end_time > get_current_utc_time():
554
+ raise ValueError("Provide 'end_time' occurring in the past.")
555
+ return (start_time, end_time)
556
+
557
+
558
+ def check_time(time):
559
+ """Check time validity.
560
+
561
+ It returns a :py:class:`datetime.datetime` object to seconds precision.
562
+
563
+ Parameters
564
+ ----------
565
+ time : datetime.datetime, datetime.date, numpy.datetime64 or str
566
+ Time object.
567
+ Accepted types: ``datetime.datetime``, ``datetime.date``, ``numpy.datetime64`` or ``str``.
568
+ If string type, it expects the isoformat ``YYYY-MM-DD hh:mm:ss``.
569
+
570
+ Returns
571
+ -------
572
+ time: datetime.datetime
573
+
574
+ """
575
+ if not isinstance(time, (datetime.datetime, datetime.date, np.datetime64, np.ndarray, str)):
576
+ raise TypeError(
577
+ "Specify time with datetime.datetime objects or a " "string of format 'YYYY-MM-DD hh:mm:ss'.",
578
+ )
579
+
580
+ # If numpy array with datetime64 (and size=1)
581
+ if isinstance(time, np.ndarray):
582
+ if np.issubdtype(time.dtype, np.datetime64):
583
+ if time.size == 1:
584
+ time = time[0].astype("datetime64[s]").tolist()
585
+ else:
586
+ raise ValueError("Expecting a single timestep!")
587
+ else:
588
+ raise ValueError("The numpy array does not have a numpy.datetime64 dtype!")
589
+
590
+ # If np.datetime64, convert to datetime.datetime
591
+ if isinstance(time, np.datetime64):
592
+ time = time.astype("datetime64[s]").tolist()
593
+ # If datetime.date, convert to datetime.datetime
594
+ if not isinstance(time, (datetime.datetime, str)):
595
+ time = datetime.datetime(time.year, time.month, time.day, 0, 0, 0)
596
+ if isinstance(time, str):
597
+ try:
598
+ time = datetime.datetime.fromisoformat(time)
599
+ except ValueError:
600
+ raise ValueError("The time string must have format 'YYYY-MM-DD hh:mm:ss'")
601
+ # If datetime object carries timezone that is not UTC, raise error
602
+ if time.tzinfo is not None:
603
+ if str(time.tzinfo) != "UTC":
604
+ raise ValueError("The datetime object must be in UTC timezone if timezone is given.")
605
+ # If UTC, strip timezone information
606
+ time = time.replace(tzinfo=None)
607
+ return time
@@ -23,6 +23,7 @@ import os
23
23
 
24
24
  from disdrodb.api.checks import check_product, check_sensor_name
25
25
  from disdrodb.api.path import define_config_dir
26
+ from disdrodb.utils.directories import list_directories
26
27
  from disdrodb.utils.yaml import read_yaml
27
28
 
28
29
  logger = logging.getLogger(__name__)
@@ -53,7 +54,7 @@ def get_sensor_configs_dir(sensor_name: str, product: str) -> str:
53
54
  config_dir = define_config_dir(product=product)
54
55
  config_sensor_dir = os.path.join(config_dir, sensor_name)
55
56
  if not os.path.exists(config_sensor_dir):
56
- list_sensors = sorted(os.listdir(config_dir))
57
+ list_sensors = sorted(list_directories(config_dir, recursive=False, return_paths=False))
57
58
  print(f"Available sensor_name are {list_sensors}")
58
59
  raise ValueError(f"The config directory {config_sensor_dir} does not exist.")
59
60
  return config_sensor_dir
@@ -102,4 +103,5 @@ def available_sensor_names() -> list:
102
103
  Sorted list of the available sensors
103
104
  """
104
105
  config_dir = define_config_dir(product="L0A")
105
- return sorted(os.listdir(config_dir))
106
+ list_sensors = sorted(list_directories(config_dir, recursive=False, return_paths=False))
107
+ return list_sensors