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.
- disdrodb/__init__.py +1 -1
- disdrodb/_config.py +1 -3
- disdrodb/_version.py +2 -2
- disdrodb/accessor/__init__.py +1 -1
- disdrodb/accessor/methods.py +18 -11
- disdrodb/api/checks.py +2 -4
- disdrodb/api/configs.py +1 -3
- disdrodb/api/create_directories.py +4 -6
- disdrodb/api/info.py +1 -3
- disdrodb/api/io.py +15 -9
- disdrodb/api/path.py +1 -3
- disdrodb/cli/disdrodb_check_metadata_archive.py +2 -2
- disdrodb/cli/disdrodb_check_products_options.py +44 -0
- disdrodb/cli/disdrodb_create_summary.py +48 -22
- disdrodb/cli/disdrodb_create_summary_station.py +39 -18
- disdrodb/cli/disdrodb_data_archive_directory.py +1 -3
- disdrodb/cli/disdrodb_download_archive.py +45 -24
- disdrodb/cli/disdrodb_download_metadata_archive.py +27 -16
- disdrodb/cli/disdrodb_download_station.py +56 -26
- disdrodb/cli/disdrodb_initialize_station.py +40 -20
- disdrodb/cli/disdrodb_metadata_archive_directory.py +1 -3
- disdrodb/cli/disdrodb_open_data_archive.py +16 -11
- disdrodb/cli/disdrodb_open_logs_directory.py +29 -18
- disdrodb/cli/disdrodb_open_metadata_archive.py +25 -11
- disdrodb/cli/disdrodb_open_metadata_directory.py +32 -20
- disdrodb/cli/disdrodb_open_product_directory.py +38 -21
- disdrodb/cli/disdrodb_open_readers_directory.py +1 -3
- disdrodb/cli/disdrodb_run.py +189 -0
- disdrodb/cli/disdrodb_run_l0.py +55 -64
- disdrodb/cli/disdrodb_run_l0_station.py +47 -52
- disdrodb/cli/disdrodb_run_l0a.py +47 -45
- disdrodb/cli/disdrodb_run_l0a_station.py +38 -37
- disdrodb/cli/disdrodb_run_l0b.py +45 -45
- disdrodb/cli/disdrodb_run_l0b_station.py +37 -36
- disdrodb/cli/disdrodb_run_l0c.py +50 -47
- disdrodb/cli/disdrodb_run_l0c_station.py +41 -38
- disdrodb/cli/disdrodb_run_l1.py +49 -45
- disdrodb/cli/disdrodb_run_l1_station.py +40 -37
- disdrodb/cli/disdrodb_run_l2e.py +50 -45
- disdrodb/cli/disdrodb_run_l2e_station.py +41 -37
- disdrodb/cli/disdrodb_run_l2m.py +49 -45
- disdrodb/cli/disdrodb_run_l2m_station.py +40 -37
- disdrodb/cli/disdrodb_run_station.py +184 -0
- disdrodb/cli/disdrodb_upload_archive.py +45 -35
- disdrodb/cli/disdrodb_upload_station.py +39 -32
- disdrodb/configs.py +13 -8
- disdrodb/constants.py +4 -2
- disdrodb/data_transfer/__init__.py +1 -3
- disdrodb/data_transfer/download_data.py +38 -54
- disdrodb/data_transfer/upload_data.py +1 -3
- disdrodb/data_transfer/zenodo.py +1 -3
- disdrodb/docs.py +1 -3
- disdrodb/etc/configs/attributes.yaml +52 -2
- disdrodb/etc/configs/encodings.yaml +45 -1
- disdrodb/etc/products/L0C/ODM470/global.yaml +5 -0
- disdrodb/etc/products/L0C/global.yaml +5 -0
- disdrodb/etc/products/L1/ODM470/global.yaml +6 -0
- disdrodb/etc/products/L1/global.yaml +1 -14
- disdrodb/etc/products/L2E/LPM/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/LPM/global.yaml +36 -0
- disdrodb/etc/products/L2E/LPM_V0/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/LPM_V0/global.yaml +36 -0
- disdrodb/etc/products/L2E/ODM470/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/ODM470/global.yaml +36 -0
- disdrodb/etc/products/L2E/PARSIVEL/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/PARSIVEL/global.yaml +36 -0
- disdrodb/etc/products/L2E/PARSIVEL2/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/PARSIVEL2/global.yaml +36 -0
- disdrodb/etc/products/L2E/PWS100/1MIN.yaml +1 -0
- disdrodb/etc/products/L2E/PWS100/global.yaml +36 -0
- disdrodb/etc/products/L2E/RD80/1MIN.yaml +19 -0
- disdrodb/etc/products/L2E/SWS250/1MIN.yaml +19 -0
- disdrodb/etc/products/L2E/global.yaml +17 -3
- disdrodb/etc/products/L2M/global.yaml +1 -1
- disdrodb/fall_velocity/__init__.py +46 -0
- disdrodb/fall_velocity/graupel.py +483 -0
- disdrodb/fall_velocity/hail.py +287 -0
- disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -50
- disdrodb/issue/__init__.py +1 -3
- disdrodb/issue/checks.py +3 -5
- disdrodb/issue/reader.py +1 -3
- disdrodb/issue/writer.py +1 -3
- disdrodb/l0/__init__.py +1 -1
- disdrodb/l0/check_configs.py +26 -17
- disdrodb/l0/check_standards.py +1 -3
- disdrodb/l0/configs/LPM/l0a_encodings.yml +0 -1
- disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +0 -4
- disdrodb/l0/configs/LPM/l0b_encodings.yml +9 -9
- disdrodb/l0/configs/LPM/raw_data_format.yml +11 -11
- disdrodb/l0/configs/LPM_V0/bins_diameter.yml +103 -0
- disdrodb/l0/configs/LPM_V0/bins_velocity.yml +103 -0
- disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +45 -0
- disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +180 -0
- disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +410 -0
- disdrodb/l0/configs/LPM_V0/raw_data_format.yml +474 -0
- disdrodb/l0/configs/ODM470/bins_diameter.yml +643 -0
- disdrodb/l0/configs/ODM470/bins_velocity.yml +0 -0
- disdrodb/l0/configs/ODM470/l0a_encodings.yml +11 -0
- disdrodb/l0/configs/ODM470/l0b_cf_attrs.yml +46 -0
- disdrodb/l0/configs/ODM470/l0b_encodings.yml +106 -0
- disdrodb/l0/configs/ODM470/raw_data_format.yml +111 -0
- disdrodb/l0/configs/PARSIVEL/l0b_cf_attrs.yml +1 -1
- disdrodb/l0/configs/PARSIVEL/raw_data_format.yml +8 -8
- disdrodb/l0/configs/PARSIVEL2/raw_data_format.yml +9 -9
- disdrodb/l0/l0_reader.py +1 -3
- disdrodb/l0/l0a_processing.py +7 -5
- disdrodb/l0/l0b_nc_processing.py +2 -4
- disdrodb/l0/l0b_processing.py +27 -22
- disdrodb/l0/l0c_processing.py +37 -11
- disdrodb/l0/manuals/LPM_V0.pdf +0 -0
- disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +1 -1
- disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +1 -1
- disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +1 -1
- disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +1 -1
- disdrodb/l0/readers/LPM/GERMANY/DWD.py +190 -12
- disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +63 -14
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +279 -0
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +279 -0
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +3 -5
- disdrodb/l0/readers/LPM/KIT/CHWALA.py +1 -3
- disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
- disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +103 -0
- disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +214 -0
- disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +206 -0
- disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +1 -3
- disdrodb/l0/readers/LPM/SLOVENIA/UL.py +1 -3
- disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +1 -3
- disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
- disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +217 -0
- disdrodb/l0/readers/LPM/USA/CHARLESTON.py +227 -0
- disdrodb/l0/readers/{LPM → LPM_V0}/BELGIUM/ULIEGE.py +34 -52
- disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +240 -0
- disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +123 -0
- disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
- disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +1 -1
- disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +1 -3
- disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2018.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/LOCARNO_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +1 -1
- disdrodb/l0/readers/PARSIVEL/JAPAN/JMA.py +1 -1
- disdrodb/l0/readers/PARSIVEL/KOREA/ICEPOP_MSC.py +159 -0
- disdrodb/l0/readers/PARSIVEL/NASA/LPVEX.py +26 -14
- disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +2 -2
- disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/OWLES_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/PLOWS_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +1 -1
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +1 -3
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +1 -3
- disdrodb/l0/readers/PARSIVEL/SLOVENIA/UL.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -2
- disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/CANADA/UQAM_NC.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/DTU.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_nc.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/GREECE/NOA.py +4 -3
- disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/ITALY/HYDROX.py +5 -3
- disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +155 -0
- disdrodb/l0/readers/PARSIVEL2/KIT/BURKINA_FASO.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/KIT/TEAMX.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/KOREA/ICEPOP_MSC.py +161 -0
- disdrodb/l0/readers/PARSIVEL2/{NASA/GCPEX.py → KOREA/ICEPOP_UCLM.py} +51 -31
- disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +15 -8
- disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +9 -4
- disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +31 -6
- disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_MIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +2 -2
- disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
- disdrodb/l0/readers/{PARSIVEL/NASA/PIERS.py → PARSIVEL2/NORWAY/UIB.py} +65 -31
- disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +7 -6
- disdrodb/l0/readers/PARSIVEL2/SPAIN/CENER.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SPAIN/CR1000DL.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SPAIN/GRANADA.py +1 -3
- disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +138 -0
- disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +49 -22
- disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +1 -3
- disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +1 -3
- disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +1 -1
- disdrodb/l0/readers/{PARSIVEL/NASA/IFLOODS.py → RD80/BRAZIL/ATTO_RD80.py} +50 -36
- disdrodb/l0/readers/RD80/BRAZIL/CHUVA_RD80.py +1 -3
- disdrodb/l0/readers/RD80/BRAZIL/GOAMAZON_RD80.py +1 -3
- disdrodb/l0/readers/RD80/NCAR/CINDY_2011_RD80.py +1 -3
- disdrodb/l0/readers/RD80/NCAR/RELAMPAGO_RD80.py +1 -3
- disdrodb/l0/readers/RD80/NOAA/PSL_RD80.py +1 -3
- disdrodb/l0/readers/{SW250 → SWS250}/BELGIUM/KMI.py +2 -4
- disdrodb/l0/readers/template_reader_raw_netcdf_data.py +1 -3
- disdrodb/l0/readers/template_reader_raw_text_data.py +1 -3
- disdrodb/l0/standards.py +4 -5
- disdrodb/l0/template_tools.py +1 -3
- disdrodb/l1/__init__.py +1 -1
- disdrodb/l1/classification.py +913 -0
- disdrodb/l1/processing.py +36 -106
- disdrodb/l1/resampling.py +8 -3
- disdrodb/l1_env/__init__.py +1 -1
- disdrodb/l1_env/routines.py +6 -6
- disdrodb/l2/__init__.py +1 -1
- disdrodb/l2/empirical_dsd.py +61 -31
- disdrodb/l2/processing.py +327 -62
- disdrodb/metadata/checks.py +1 -3
- disdrodb/metadata/download.py +4 -4
- disdrodb/metadata/geolocation.py +1 -3
- disdrodb/metadata/info.py +1 -3
- disdrodb/metadata/manipulation.py +1 -3
- disdrodb/metadata/reader.py +1 -3
- disdrodb/metadata/search.py +1 -3
- disdrodb/metadata/standards.py +1 -3
- disdrodb/metadata/writer.py +1 -3
- disdrodb/physics/__init__.py +17 -0
- disdrodb/physics/atmosphere.py +272 -0
- disdrodb/physics/water.py +130 -0
- disdrodb/physics/wrappers.py +62 -0
- disdrodb/psd/__init__.py +1 -1
- disdrodb/psd/fitting.py +22 -9
- disdrodb/psd/models.py +1 -1
- disdrodb/routines/__init__.py +5 -1
- disdrodb/routines/l0.py +28 -18
- disdrodb/routines/l1.py +8 -6
- disdrodb/routines/l2.py +8 -4
- disdrodb/routines/options.py +116 -71
- disdrodb/routines/options_validation.py +728 -0
- disdrodb/routines/wrappers.py +431 -11
- disdrodb/scattering/__init__.py +1 -1
- disdrodb/scattering/axis_ratio.py +9 -6
- disdrodb/scattering/permittivity.py +8 -8
- disdrodb/scattering/routines.py +32 -14
- disdrodb/summary/__init__.py +1 -1
- disdrodb/summary/routines.py +146 -86
- disdrodb/utils/__init__.py +1 -1
- disdrodb/utils/archiving.py +16 -9
- disdrodb/utils/attrs.py +4 -3
- disdrodb/utils/cli.py +8 -10
- disdrodb/utils/compression.py +13 -13
- disdrodb/utils/dask.py +33 -14
- disdrodb/utils/dataframe.py +1 -3
- disdrodb/utils/decorators.py +1 -3
- disdrodb/utils/dict.py +1 -1
- disdrodb/utils/directories.py +3 -5
- disdrodb/utils/encoding.py +2 -4
- disdrodb/utils/event.py +1 -1
- disdrodb/utils/list.py +1 -3
- disdrodb/utils/logger.py +1 -3
- disdrodb/utils/manipulations.py +182 -6
- disdrodb/utils/pydantic.py +80 -0
- disdrodb/utils/routines.py +1 -3
- disdrodb/utils/subsetting.py +1 -1
- disdrodb/utils/time.py +3 -2
- disdrodb/utils/warnings.py +1 -3
- disdrodb/utils/writer.py +1 -3
- disdrodb/utils/xarray.py +30 -3
- disdrodb/utils/yaml.py +1 -3
- disdrodb/viz/__init__.py +1 -1
- disdrodb/viz/plots.py +197 -21
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/METADATA +2 -2
- disdrodb-0.3.0.dist-info/RECORD +358 -0
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/entry_points.txt +3 -0
- disdrodb/etc/products/L1/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/LPM/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/PARSIVEL/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/PARSIVEL2/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/PWS100/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/RD80/1MIN.yaml +0 -13
- disdrodb/etc/products/L1/SWS250/1MIN.yaml +0 -13
- disdrodb/etc/products/L2M/10MIN.yaml +0 -12
- disdrodb/l1/beard_model.py +0 -618
- disdrodb/l1/filters.py +0 -203
- disdrodb-0.2.0.dist-info/RECORD +0 -312
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/WHEEL +0 -0
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {disdrodb-0.2.0.dist-info → disdrodb-0.3.0.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
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
|
|
@@ -51,35 +49,44 @@ def disdrodb_upload_station(
|
|
|
51
49
|
data_archive_dir: Optional[str] = None,
|
|
52
50
|
metadata_archive_dir: Optional[str] = None,
|
|
53
51
|
):
|
|
54
|
-
"""
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
If
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
52
|
+
"""Upload raw data from a single DISDRODB station to the DISDRODB Decentralized Data Archive.
|
|
53
|
+
|
|
54
|
+
Currently, only upload to the Zenodo data repository is implemented.
|
|
55
|
+
|
|
56
|
+
The station metadata file is automatically updated with the remote data URL.
|
|
57
|
+
|
|
58
|
+
PLEASE UPLOAD JUST YOUR DATA !
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
\b
|
|
62
|
+
Upload Behavior:
|
|
63
|
+
By default, upload is skipped if data already exists on a remote location.
|
|
64
|
+
Use '--force True' to upload even if data already exists remotely.
|
|
65
|
+
Warning: Forcing upload will overwrite the existing disdrodb_data_url in metadata.
|
|
66
|
+
|
|
67
|
+
\b
|
|
68
|
+
Upload Options:
|
|
69
|
+
--platform: Remote platform name (default: 'sandbox.zenodo' for testing)
|
|
70
|
+
Use 'zenodo' for final data dissemination
|
|
71
|
+
--force: Upload even if data already exists remotely (default: False)
|
|
72
|
+
|
|
73
|
+
\b
|
|
74
|
+
Archive Directories:
|
|
75
|
+
--data_archive_dir: Custom path to DISDRODB data archive
|
|
76
|
+
--metadata_archive_dir: Custom path to DISDRODB metadata archive
|
|
77
|
+
If not specified, paths from the active DISDRODB configuration are used
|
|
78
|
+
|
|
79
|
+
\b
|
|
80
|
+
Examples:
|
|
81
|
+
# Upload a station to sandbox for testing
|
|
82
|
+
disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME
|
|
83
|
+
|
|
84
|
+
# Upload a station to production Zenodo
|
|
85
|
+
disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME --platform zenodo
|
|
86
|
+
|
|
87
|
+
# Force upload and update metadata URL
|
|
88
|
+
disdrodb_upload_station DATA_SOURCE CAMPAIGN_NAME STATION_NAME --force True
|
|
89
|
+
""" # noqa: D301
|
|
83
90
|
from disdrodb.data_transfer.upload_data import upload_station
|
|
84
91
|
|
|
85
92
|
data_archive_dir = parse_archive_dir(data_archive_dir)
|
disdrodb/configs.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
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
|
|
@@ -194,7 +192,11 @@ def get_scattering_table_dir(scattering_table_dir=None):
|
|
|
194
192
|
if scattering_table_dir is None:
|
|
195
193
|
scattering_table_dir = disdrodb.config.get("scattering_table_dir", None)
|
|
196
194
|
if scattering_table_dir is None:
|
|
197
|
-
|
|
195
|
+
msg = (
|
|
196
|
+
"The directory where to save DISDRODB T-Matrix scattering look-up tables is not specified. "
|
|
197
|
+
+ "Please specify it using disdrodb.define_configs(scattering_table_dir=<path>)"
|
|
198
|
+
)
|
|
199
|
+
raise ValueError(msg)
|
|
198
200
|
scattering_table_dir = check_scattering_table_dir(scattering_table_dir) # ensure Path converted to str
|
|
199
201
|
return scattering_table_dir
|
|
200
202
|
|
|
@@ -246,16 +248,19 @@ def get_default_products_configs_dir():
|
|
|
246
248
|
return products_configs_dir
|
|
247
249
|
|
|
248
250
|
|
|
249
|
-
def get_products_configs_dir():
|
|
251
|
+
def get_products_configs_dir(products_configs_dir=None):
|
|
250
252
|
"""Return the DISDRODB products configuration directory."""
|
|
251
253
|
import disdrodb
|
|
252
254
|
|
|
253
|
-
if
|
|
255
|
+
if products_configs_dir is not None:
|
|
256
|
+
return str(products_configs_dir)
|
|
257
|
+
|
|
258
|
+
if os.environ.get("PYTEST_CURRENT_TEST") and not os.environ.get("DISDRODB_VALIDATION_FLAG"):
|
|
254
259
|
products_configs_dir = os.path.join(disdrodb.package_dir, "tests", "products")
|
|
255
260
|
else:
|
|
256
261
|
products_configs_dir = disdrodb.config.get("products_configs_dir", None)
|
|
257
|
-
if products_configs_dir is None:
|
|
258
|
-
products_configs_dir = get_default_products_configs_dir()
|
|
262
|
+
if products_configs_dir is None: # not specified by user
|
|
263
|
+
products_configs_dir = get_default_products_configs_dir() # take disdrodb defaults
|
|
259
264
|
return products_configs_dir
|
|
260
265
|
|
|
261
266
|
|
disdrodb/constants.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# -----------------------------------------------------------------------------.
|
|
2
|
-
# Copyright (c) 2021-
|
|
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
|
|
@@ -41,7 +41,9 @@ COORDINATES = [
|
|
|
41
41
|
"time",
|
|
42
42
|
"sample_interval",
|
|
43
43
|
]
|
|
44
|
-
|
|
44
|
+
METEOROLOGICAL_VARIABLES = ["air_temperature", "relative_humidity", "wind_speed", "wind_direction"]
|
|
45
|
+
|
|
46
|
+
OPTICAL_SENSORS = ["PARSIVEL", "PARSIVEL2", "LPM", "LPM_V0", "PWS100", "SWS250", "ODM470"]
|
|
45
47
|
IMPACT_SENSORS = ["RD80"]
|
|
46
48
|
|
|
47
49
|
PRODUCTS = ["RAW", "L0A", "L0B", "L0C", "L1", "L2E", "L2M"]
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
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-
|
|
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
|
|
@@ -17,7 +15,6 @@
|
|
|
17
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
16
|
# -----------------------------------------------------------------------------.
|
|
19
17
|
"""Routines to download data from the DISDRODB Decentralized Data Archive."""
|
|
20
|
-
|
|
21
18
|
import logging
|
|
22
19
|
import os
|
|
23
20
|
import shutil
|
|
@@ -33,7 +30,7 @@ from disdrodb.api.path import define_metadata_filepath, define_station_dir
|
|
|
33
30
|
from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
|
|
34
31
|
from disdrodb.metadata import get_list_metadata
|
|
35
32
|
from disdrodb.utils.compression import unzip_file
|
|
36
|
-
from disdrodb.utils.directories import is_empty_directory
|
|
33
|
+
from disdrodb.utils.directories import is_empty_directory, remove_file_or_directories
|
|
37
34
|
from disdrodb.utils.yaml import read_yaml
|
|
38
35
|
|
|
39
36
|
|
|
@@ -123,7 +120,7 @@ def download_archive(
|
|
|
123
120
|
If not provided (``None``), all stations will be downloaded.
|
|
124
121
|
The default value is ``station_name=None``.
|
|
125
122
|
force : bool, optional
|
|
126
|
-
If ``True``,
|
|
123
|
+
If ``True``, delete existing files and re-download raw data files.
|
|
127
124
|
The default value is ``False``.
|
|
128
125
|
data_archive_dir : str (optional)
|
|
129
126
|
DISDRODB Data Archive directory. Format: ``<...>/DISDRODB``.
|
|
@@ -167,7 +164,8 @@ def download_archive(
|
|
|
167
164
|
force=force,
|
|
168
165
|
)
|
|
169
166
|
except Exception as e:
|
|
170
|
-
|
|
167
|
+
msg = e.args[0] if e.args else str(e)
|
|
168
|
+
print(f" - Download error: {msg}")
|
|
171
169
|
print(" ")
|
|
172
170
|
|
|
173
171
|
|
|
@@ -196,7 +194,7 @@ def download_station(
|
|
|
196
194
|
The base directory of DISDRODB, expected in the format ``<...>/DISDRODB``.
|
|
197
195
|
If not specified, the path specified in the DISDRODB active configuration will be used.
|
|
198
196
|
force: bool, optional
|
|
199
|
-
If ``True``,
|
|
197
|
+
If ``True``, remove existing data and re-download.
|
|
200
198
|
The default value is ``False``.
|
|
201
199
|
data_archive_dir : str (optional)
|
|
202
200
|
DISDRODB Data Archive directory. Format: ``<...>/DISDRODB``.
|
|
@@ -240,7 +238,7 @@ def check_consistent_station_name(metadata_filepath, station_name):
|
|
|
240
238
|
|
|
241
239
|
|
|
242
240
|
def download_station_data(metadata_filepath: str, data_archive_dir: str, force: bool = False, verbose=True) -> None:
|
|
243
|
-
"""Download and unzip the station data
|
|
241
|
+
"""Download and unzip the station data.
|
|
244
242
|
|
|
245
243
|
Parameters
|
|
246
244
|
----------
|
|
@@ -270,26 +268,34 @@ def download_station_data(metadata_filepath: str, data_archive_dir: str, force:
|
|
|
270
268
|
product="RAW",
|
|
271
269
|
)
|
|
272
270
|
# Check DISDRODB data url
|
|
273
|
-
disdrodb_data_url = metadata_dict.get("disdrodb_data_url",
|
|
271
|
+
disdrodb_data_url = metadata_dict.get("disdrodb_data_url", "")
|
|
272
|
+
if disdrodb_data_url == "":
|
|
273
|
+
raise ValueError(f"{campaign_name} {station_name} station data are not yet publicly available.")
|
|
274
274
|
if not _is_valid_disdrodb_data_url(disdrodb_data_url):
|
|
275
275
|
raise ValueError(f"Invalid disdrodb_data_url '{disdrodb_data_url}' for station {station_name}")
|
|
276
276
|
|
|
277
|
+
# Remove existing station directory if force=True
|
|
278
|
+
if force and os.path.exists(station_dir):
|
|
279
|
+
print(f" - Removing existing station data at {station_dir}.")
|
|
280
|
+
remove_file_or_directories(station_dir)
|
|
281
|
+
|
|
277
282
|
# Download files
|
|
278
283
|
# - Option 1: Download ZIP file containing all station raw data
|
|
279
|
-
|
|
280
|
-
|
|
284
|
+
zip_repos = ["https://zenodo.org/", "https://cloudnet.fmi.fi/", "https://data.dtu.dk/"]
|
|
285
|
+
if any(disdrodb_data_url.startswith(repo) for repo in zip_repos):
|
|
286
|
+
download_zip_file(url=disdrodb_data_url, dst_dir=station_dir)
|
|
281
287
|
|
|
282
288
|
# - Option 2: Recursive download from a web server via HTTP or HTTPS.
|
|
283
289
|
elif disdrodb_data_url.startswith("http"):
|
|
284
|
-
download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir,
|
|
290
|
+
download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
|
|
285
291
|
# - Retry to be more sure that all data have been downloaded
|
|
286
|
-
download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir,
|
|
292
|
+
download_web_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
|
|
287
293
|
|
|
288
294
|
# - Option 3: Recursive download from a ftp server
|
|
289
295
|
elif disdrodb_data_url.startswith("ftp"):
|
|
290
|
-
download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir,
|
|
296
|
+
download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
|
|
291
297
|
# - Retry to be more sure that all data have been downloaded
|
|
292
|
-
download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir,
|
|
298
|
+
download_ftp_server_data(url=disdrodb_data_url, dst_dir=station_dir, verbose=verbose)
|
|
293
299
|
|
|
294
300
|
else:
|
|
295
301
|
raise NotImplementedError(f"Open a GitHub Issue to enable the download of data from {disdrodb_data_url}.")
|
|
@@ -299,7 +305,7 @@ def download_station_data(metadata_filepath: str, data_archive_dir: str, force:
|
|
|
299
305
|
#### Download from Web Server via HTTP or HTTPS
|
|
300
306
|
|
|
301
307
|
|
|
302
|
-
def download_web_server_data(url: str, dst_dir: str,
|
|
308
|
+
def download_web_server_data(url: str, dst_dir: str, verbose=True) -> None:
|
|
303
309
|
"""Download data from a web server via HTTP or HTTPS.
|
|
304
310
|
|
|
305
311
|
Use the system's wget command to recursively download all files and subdirectories
|
|
@@ -317,9 +323,6 @@ def download_web_server_data(url: str, dst_dir: str, force=True, verbose=True) -
|
|
|
317
323
|
HTTPS URL pointing to webserver folder. Example: "https://ruisdael.citg.tudelft.nl/parsivel/PAR001_Cabauw/"
|
|
318
324
|
dst_dir : str
|
|
319
325
|
Local directory where to download the file (DISDRODB station data directory).
|
|
320
|
-
force : bool, optional
|
|
321
|
-
If ``True``, re-download new/updated files (skip unchanged ones).
|
|
322
|
-
If ``False``, keep existing files untouched.
|
|
323
326
|
verbose : bool, optional
|
|
324
327
|
Print wget output (default is True).
|
|
325
328
|
"""
|
|
@@ -336,7 +339,7 @@ def download_web_server_data(url: str, dst_dir: str, force=True, verbose=True) -
|
|
|
336
339
|
os.makedirs(dst_dir, exist_ok=True)
|
|
337
340
|
|
|
338
341
|
# 5. Build wget command
|
|
339
|
-
cmd = build_webserver_wget_command(url, cut_dirs=cut_dirs, dst_dir=dst_dir,
|
|
342
|
+
cmd = build_webserver_wget_command(url, cut_dirs=cut_dirs, dst_dir=dst_dir, verbose=verbose)
|
|
340
343
|
|
|
341
344
|
# 6. Run wget command
|
|
342
345
|
try:
|
|
@@ -375,7 +378,7 @@ def compute_cut_dirs(url: str) -> int:
|
|
|
375
378
|
return len(segments)
|
|
376
379
|
|
|
377
380
|
|
|
378
|
-
def build_webserver_wget_command(url: str, cut_dirs: int, dst_dir: str,
|
|
381
|
+
def build_webserver_wget_command(url: str, cut_dirs: int, dst_dir: str, verbose: bool) -> list[str]:
|
|
379
382
|
"""Construct the wget command list for subprocess.run.
|
|
380
383
|
|
|
381
384
|
Notes
|
|
@@ -400,9 +403,9 @@ def build_webserver_wget_command(url: str, cut_dirs: int, dst_dir: str, force: b
|
|
|
400
403
|
"--reject",
|
|
401
404
|
"index.html*", # avoid to download Apache autoindex index.html
|
|
402
405
|
f"--cut-dirs={cut_dirs}",
|
|
406
|
+
# Downloads just new data without re-downloading existing files
|
|
407
|
+
"--timestamping", # -N
|
|
403
408
|
]
|
|
404
|
-
if force:
|
|
405
|
-
cmd.append("--timestamping") # -N
|
|
406
409
|
|
|
407
410
|
# Define source and destination directory
|
|
408
411
|
cmd += [
|
|
@@ -421,7 +424,6 @@ def build_ftp_server_wget_command(
|
|
|
421
424
|
url: str,
|
|
422
425
|
cut_dirs: int,
|
|
423
426
|
dst_dir: str,
|
|
424
|
-
force: bool,
|
|
425
427
|
verbose: bool,
|
|
426
428
|
) -> list[str]:
|
|
427
429
|
"""Construct the wget command list for FTP recursive download.
|
|
@@ -434,9 +436,6 @@ def build_ftp_server_wget_command(
|
|
|
434
436
|
Number of leading path components to strip.
|
|
435
437
|
dst_dir : str
|
|
436
438
|
Local destination directory.
|
|
437
|
-
force : bool
|
|
438
|
-
If True, re-download newer files (--timestamping).
|
|
439
|
-
If False, keep existing files untouched (--no-clobber).
|
|
440
439
|
verbose : bool
|
|
441
440
|
If False, suppress wget output (-q).
|
|
442
441
|
"""
|
|
@@ -450,14 +449,7 @@ def build_ftp_server_wget_command(
|
|
|
450
449
|
"-np", # no parent --> don't ascend to higher-level dirs
|
|
451
450
|
"-nH", # no host dirs --> avoid creating ftp.example.com/ locally
|
|
452
451
|
f"--cut-dirs={cut_dirs}", # strip N leading path components
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
if force:
|
|
456
|
-
cmd.append("--timestamping") # download if remote file is newer
|
|
457
|
-
else:
|
|
458
|
-
cmd.append("--no-clobber") # skip files that already exist
|
|
459
|
-
|
|
460
|
-
cmd += [
|
|
452
|
+
"--timestamping", # download if remote file is newer
|
|
461
453
|
"-P", # specify local destination directory
|
|
462
454
|
dst_dir,
|
|
463
455
|
f"ftp://anonymous:disdrodb@{url}", # target FTP URL
|
|
@@ -465,7 +457,7 @@ def build_ftp_server_wget_command(
|
|
|
465
457
|
return cmd
|
|
466
458
|
|
|
467
459
|
|
|
468
|
-
def download_ftp_server_data(url: str, dst_dir: str,
|
|
460
|
+
def download_ftp_server_data(url: str, dst_dir: str, verbose: bool = True) -> None:
|
|
469
461
|
"""Download data from an FTP server with anonymous login.
|
|
470
462
|
|
|
471
463
|
Parameters
|
|
@@ -474,9 +466,6 @@ def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbos
|
|
|
474
466
|
FTP server URL pointing to a folder. Example: "ftp://ftp.example.com/path/to/data/"
|
|
475
467
|
dst_dir : str
|
|
476
468
|
Local directory where to download the file (DISDRODB station data directory).
|
|
477
|
-
force : bool, optional
|
|
478
|
-
If ``True``, re-download new/updated files (skip unchanged ones).
|
|
479
|
-
If ``False``, keep existing files untouched.
|
|
480
469
|
verbose : bool, optional
|
|
481
470
|
Print wget output (default is True).
|
|
482
471
|
"""
|
|
@@ -496,7 +485,6 @@ def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbos
|
|
|
496
485
|
url,
|
|
497
486
|
cut_dirs=cut_dirs,
|
|
498
487
|
dst_dir=dst_dir,
|
|
499
|
-
force=force,
|
|
500
488
|
verbose=verbose,
|
|
501
489
|
)
|
|
502
490
|
# Run wget
|
|
@@ -515,15 +503,15 @@ def download_ftp_server_data(url: str, dst_dir: str, force: bool = False, verbos
|
|
|
515
503
|
#### Download from Zenodo
|
|
516
504
|
|
|
517
505
|
|
|
518
|
-
def download_zip_file(url, dst_dir
|
|
506
|
+
def download_zip_file(url, dst_dir):
|
|
519
507
|
"""Download zip file from zenodo and extract station raw data."""
|
|
520
508
|
# Download zip file
|
|
521
|
-
zip_filepath = _download_file_from_url(url, dst_dir=dst_dir
|
|
509
|
+
zip_filepath = _download_file_from_url(url, dst_dir=dst_dir)
|
|
522
510
|
# Extract the stations files from the downloaded station.zip file
|
|
523
511
|
_extract_station_files(zip_filepath, station_dir=dst_dir)
|
|
524
512
|
|
|
525
513
|
|
|
526
|
-
def _download_file_from_url(url: str, dst_dir: str
|
|
514
|
+
def _download_file_from_url(url: str, dst_dir: str) -> str:
|
|
527
515
|
"""Download station zip file into the DISDRODB station data directory.
|
|
528
516
|
|
|
529
517
|
Parameters
|
|
@@ -532,8 +520,6 @@ def _download_file_from_url(url: str, dst_dir: str, force: bool = False) -> str:
|
|
|
532
520
|
URL of the file to download.
|
|
533
521
|
dst_dir : str
|
|
534
522
|
Local directory where to download the file (DISDRODB station data directory).
|
|
535
|
-
force : bool, optional
|
|
536
|
-
Overwrite the raw data file if already existing. The default value is ``False``.
|
|
537
523
|
|
|
538
524
|
Returns
|
|
539
525
|
-------
|
|
@@ -544,16 +530,14 @@ def _download_file_from_url(url: str, dst_dir: str, force: bool = False) -> str:
|
|
|
544
530
|
"""
|
|
545
531
|
dst_filename = os.path.basename(dst_dir) + ".zip"
|
|
546
532
|
dst_filepath = os.path.join(dst_dir, dst_filename)
|
|
533
|
+
# Ensure destination directory exists and is empty
|
|
547
534
|
os.makedirs(dst_dir, exist_ok=True)
|
|
548
535
|
if not is_empty_directory(dst_dir):
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
f"There are already raw files within the DISDRODB Data Archive at {dst_dir}. Download is suspended. "
|
|
555
|
-
"Use force=True to force the download and overwrite existing raw files.",
|
|
556
|
-
)
|
|
536
|
+
raise ValueError(
|
|
537
|
+
"ZIP archive download is aborted."
|
|
538
|
+
f"There are already raw files within the DISDRODB Data Archive at {dst_dir}."
|
|
539
|
+
"Use force=True if you wish to remove existing files and redownload the station archive.",
|
|
540
|
+
)
|
|
557
541
|
|
|
558
542
|
os.makedirs(dst_dir, exist_ok=True)
|
|
559
543
|
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
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/data_transfer/zenodo.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
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/docs.py
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
1
|
# -----------------------------------------------------------------------------.
|
|
4
|
-
# Copyright (c) 2021-
|
|
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
|
|
@@ -67,6 +67,36 @@ sample_interval:
|
|
|
67
67
|
long_name: Sampling interval
|
|
68
68
|
description: Sampling interval in seconds.
|
|
69
69
|
unit: s
|
|
70
|
+
n_particles:
|
|
71
|
+
long_name: "number of particles"
|
|
72
|
+
standard_name: "number_of_particles"
|
|
73
|
+
units: "1"
|
|
74
|
+
description: "Total count of hydrometeor particles."
|
|
75
|
+
valid_min: 0
|
|
76
|
+
n_low_density_graupel:
|
|
77
|
+
long_name: "number of low-density graupel particles"
|
|
78
|
+
standard_name: "number_of_graupel_particles"
|
|
79
|
+
units: "1"
|
|
80
|
+
description: "Count of low-density (<400 kg/m3) graupel particles."
|
|
81
|
+
valid_min: 0
|
|
82
|
+
n_high_density_graupel:
|
|
83
|
+
long_name: "number of high-density graupel particles"
|
|
84
|
+
standard_name: "number_of_graupel_particles"
|
|
85
|
+
units: "1"
|
|
86
|
+
description: "Count of high-density (>400 kg/m3) graupel particles."
|
|
87
|
+
valid_min: 0
|
|
88
|
+
n_small_hail:
|
|
89
|
+
long_name: "number of small hail particles"
|
|
90
|
+
standard_name: "number_of_small_hail_particles"
|
|
91
|
+
units: "1"
|
|
92
|
+
description: "Count of hail particles smaller than 8 mm in diameter."
|
|
93
|
+
valid_min: 0
|
|
94
|
+
n_large_hail:
|
|
95
|
+
long_name: "number of large hail particles"
|
|
96
|
+
standard_name: "number_of_large_hail_particles"
|
|
97
|
+
units: "1"
|
|
98
|
+
description: "Count of hail particles larger than 8 mm in diameter."
|
|
99
|
+
valid_min: 0
|
|
70
100
|
drop_number:
|
|
71
101
|
description: Counts of drops per diameter and velocity class
|
|
72
102
|
long_name: Drop counts per diameter and velocity class
|
|
@@ -259,8 +289,12 @@ RHOHV:
|
|
|
259
289
|
reflectivity
|
|
260
290
|
long_name: Copolarized Correlation Coefficient
|
|
261
291
|
units: ""
|
|
262
|
-
|
|
263
|
-
description: Linear depolarization ratio
|
|
292
|
+
LDRH:
|
|
293
|
+
description: Linear depolarization ratio at horizontal polarization
|
|
294
|
+
long_name: Linear Depolarization Ratio
|
|
295
|
+
units: dB
|
|
296
|
+
LDRV:
|
|
297
|
+
description: Linear depolarization ratio at vertical polarization
|
|
264
298
|
long_name: Linear Depolarization Ratio
|
|
265
299
|
units: dB
|
|
266
300
|
KDP:
|
|
@@ -337,3 +371,19 @@ KLDiv:
|
|
|
337
371
|
description: A distance measure of how the modelled distribution diverges from the observed N(D) one.
|
|
338
372
|
units: ""
|
|
339
373
|
valid_range: [0, inf]
|
|
374
|
+
air_temperature:
|
|
375
|
+
description: "Air temperature in degrees Celsius (C)"
|
|
376
|
+
long_name: Air temperature
|
|
377
|
+
units: "degC"
|
|
378
|
+
relative_humidity:
|
|
379
|
+
description: "Relative humidity in percent (%)"
|
|
380
|
+
long_name: Relative humidity
|
|
381
|
+
units: "%"
|
|
382
|
+
wind_speed:
|
|
383
|
+
description: "Wind speed in m/s"
|
|
384
|
+
long_name: Wind speed
|
|
385
|
+
units: "m/s"
|
|
386
|
+
wind_direction:
|
|
387
|
+
description: "Wind direction in degrees (0-360)"
|
|
388
|
+
long_name: Wind direction
|
|
389
|
+
units: "degrees"
|
|
@@ -373,7 +373,14 @@ DELTAHV:
|
|
|
373
373
|
shuffle: true
|
|
374
374
|
fletcher32: false
|
|
375
375
|
contiguous: false
|
|
376
|
-
|
|
376
|
+
LDRH:
|
|
377
|
+
dtype: float32
|
|
378
|
+
zlib: true
|
|
379
|
+
complevel: 3
|
|
380
|
+
shuffle: true
|
|
381
|
+
fletcher32: false
|
|
382
|
+
contiguous: false
|
|
383
|
+
LDRV:
|
|
377
384
|
dtype: float32
|
|
378
385
|
zlib: true
|
|
379
386
|
complevel: 3
|
|
@@ -471,3 +478,40 @@ KLDiv:
|
|
|
471
478
|
shuffle: true
|
|
472
479
|
fletcher32: false
|
|
473
480
|
contiguous: false
|
|
481
|
+
air_temperature:
|
|
482
|
+
dtype: uint16
|
|
483
|
+
scale_factor: 0.1
|
|
484
|
+
add_offset: -99.9
|
|
485
|
+
zlib: true
|
|
486
|
+
complevel: 3
|
|
487
|
+
shuffle: true
|
|
488
|
+
fletcher32: false
|
|
489
|
+
contiguous: false
|
|
490
|
+
_FillValue: 65535
|
|
491
|
+
relative_humidity:
|
|
492
|
+
dtype: uint16
|
|
493
|
+
scale_factor: 0.01
|
|
494
|
+
zlib: true
|
|
495
|
+
complevel: 3
|
|
496
|
+
shuffle: true
|
|
497
|
+
fletcher32: false
|
|
498
|
+
contiguous: false
|
|
499
|
+
_FillValue: 65535
|
|
500
|
+
wind_speed:
|
|
501
|
+
dtype: uint16
|
|
502
|
+
scale_factor: 0.1
|
|
503
|
+
add_offset: -99.9
|
|
504
|
+
zlib: true
|
|
505
|
+
complevel: 3
|
|
506
|
+
shuffle: true
|
|
507
|
+
fletcher32: false
|
|
508
|
+
contiguous: false
|
|
509
|
+
_FillValue: 65535
|
|
510
|
+
wind_direction:
|
|
511
|
+
dtype: uint16
|
|
512
|
+
zlib: true
|
|
513
|
+
complevel: 3
|
|
514
|
+
shuffle: true
|
|
515
|
+
fletcher32: false
|
|
516
|
+
contiguous: false
|
|
517
|
+
_FillValue: 65535
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
temporal_resolutions: ["1MIN", "5MIN", "10MIN", "ROLL1MIN"
|
|
1
|
+
temporal_resolutions: ["1MIN", "5MIN", "10MIN", "ROLL1MIN"]
|
|
2
2
|
archive_options:
|
|
3
3
|
strategy: time_block
|
|
4
4
|
strategy_options:
|
|
5
5
|
freq: day
|
|
6
6
|
folder_partitioning: "year"
|
|
7
|
-
product_options:
|
|
8
|
-
fall_velocity_model: "Beard1976"
|
|
9
|
-
minimum_diameter: 0
|
|
10
|
-
maximum_diameter: 10
|
|
11
|
-
minimum_velocity: 0
|
|
12
|
-
maximum_velocity: 12
|
|
13
|
-
above_velocity_fraction: 0.5
|
|
14
|
-
above_velocity_tolerance: null
|
|
15
|
-
below_velocity_fraction: 0.5
|
|
16
|
-
below_velocity_tolerance: null
|
|
17
|
-
small_diameter_threshold: 1
|
|
18
|
-
small_velocity_threshold: 2.5
|
|
19
|
-
maintain_smallest_drops: True
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
radar_enabled: True
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
temporal_resolutions: ["1MIN", "5MIN", "10MIN"]
|
|
2
|
+
archive_options:
|
|
3
|
+
strategy: time_block
|
|
4
|
+
strategy_options:
|
|
5
|
+
freq: month
|
|
6
|
+
folder_partitioning: ""
|
|
7
|
+
product_options:
|
|
8
|
+
compute_spectra: False
|
|
9
|
+
compute_percentage_contribution: False
|
|
10
|
+
minimum_ndrops: 1
|
|
11
|
+
minimum_nbins: 1
|
|
12
|
+
minimum_rain_rate: 0.01
|
|
13
|
+
fall_velocity_model: "Beard1976"
|
|
14
|
+
minimum_diameter: 0.375
|
|
15
|
+
maximum_diameter: 10
|
|
16
|
+
minimum_velocity: 0
|
|
17
|
+
maximum_velocity: 12
|
|
18
|
+
keep_mixed_precipitation: False
|
|
19
|
+
above_velocity_fraction: null
|
|
20
|
+
above_velocity_tolerance: 3
|
|
21
|
+
below_velocity_fraction: null
|
|
22
|
+
below_velocity_tolerance: 3
|
|
23
|
+
maintain_drops_smaller_than: 1
|
|
24
|
+
maintain_drops_slower_than: 2.5
|
|
25
|
+
maintain_smallest_drops: True
|
|
26
|
+
remove_splashing_drops: True
|
|
27
|
+
radar_enabled: False
|
|
28
|
+
radar_options:
|
|
29
|
+
frequency: ["S", "C", "X", "Ku", "K", "Ka", "W"]
|
|
30
|
+
num_points: 1024
|
|
31
|
+
diameter_max: 10
|
|
32
|
+
canting_angle_std: 7
|
|
33
|
+
axis_ratio_model: Thurai2007
|
|
34
|
+
permittivity_model: Turner2016
|
|
35
|
+
water_temperature: 10
|
|
36
|
+
elevation_angle: 0
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
radar_enabled: True
|