disdrodb 0.2.1__py3-none-any.whl → 0.4.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 +3 -1
- disdrodb/_config.py +2 -3
- disdrodb/_version.py +2 -2
- disdrodb/accessor/__init__.py +2 -1
- disdrodb/accessor/methods.py +10 -9
- disdrodb/api/checks.py +3 -7
- disdrodb/api/configs.py +1 -3
- disdrodb/api/create_directories.py +4 -6
- disdrodb/api/info.py +1 -3
- disdrodb/api/io.py +233 -32
- disdrodb/api/path.py +3 -7
- disdrodb/cli/disdrodb_check_metadata_archive.py +3 -2
- disdrodb/cli/disdrodb_check_products_options.py +45 -0
- disdrodb/cli/disdrodb_create_summary.py +54 -28
- disdrodb/cli/disdrodb_create_summary_station.py +41 -20
- disdrodb/cli/disdrodb_data_archive_directory.py +2 -3
- disdrodb/cli/disdrodb_download_archive.py +50 -30
- disdrodb/cli/disdrodb_download_metadata_archive.py +28 -16
- disdrodb/cli/disdrodb_download_station.py +58 -29
- disdrodb/cli/disdrodb_initialize_station.py +43 -23
- disdrodb/cli/disdrodb_metadata_archive_directory.py +2 -3
- disdrodb/cli/disdrodb_open_data_archive.py +17 -13
- disdrodb/cli/disdrodb_open_logs_directory.py +31 -21
- disdrodb/cli/disdrodb_open_metadata_archive.py +26 -13
- disdrodb/cli/disdrodb_open_metadata_directory.py +34 -23
- disdrodb/cli/disdrodb_open_product_directory.py +39 -23
- disdrodb/cli/disdrodb_open_readers_directory.py +2 -3
- disdrodb/cli/disdrodb_run.py +189 -0
- disdrodb/cli/disdrodb_run_l0.py +61 -70
- disdrodb/cli/disdrodb_run_l0_station.py +50 -55
- disdrodb/cli/disdrodb_run_l0a.py +53 -51
- disdrodb/cli/disdrodb_run_l0a_station.py +41 -40
- disdrodb/cli/disdrodb_run_l0b.py +51 -51
- disdrodb/cli/disdrodb_run_l0b_station.py +40 -39
- disdrodb/cli/disdrodb_run_l0c.py +56 -53
- disdrodb/cli/disdrodb_run_l0c_station.py +44 -41
- disdrodb/cli/disdrodb_run_l1.py +55 -51
- disdrodb/cli/disdrodb_run_l1_station.py +43 -40
- disdrodb/cli/disdrodb_run_l2e.py +56 -51
- disdrodb/cli/disdrodb_run_l2e_station.py +44 -40
- disdrodb/cli/disdrodb_run_l2m.py +55 -51
- disdrodb/cli/disdrodb_run_l2m_station.py +43 -40
- disdrodb/cli/disdrodb_run_station.py +184 -0
- disdrodb/cli/disdrodb_upload_archive.py +51 -42
- disdrodb/cli/disdrodb_upload_station.py +42 -36
- disdrodb/configs.py +20 -16
- disdrodb/constants.py +5 -2
- disdrodb/data_transfer/__init__.py +1 -3
- disdrodb/data_transfer/download_data.py +45 -61
- disdrodb/data_transfer/upload_data.py +7 -11
- disdrodb/data_transfer/zenodo.py +2 -4
- 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 +0 -13
- 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 +16 -2
- disdrodb/fall_velocity/__init__.py +47 -0
- disdrodb/fall_velocity/graupel.py +484 -0
- disdrodb/fall_velocity/hail.py +288 -0
- disdrodb/{l1/fall_velocity.py → fall_velocity/rain.py} +265 -44
- disdrodb/issue/__init__.py +1 -3
- disdrodb/issue/checks.py +2 -3
- disdrodb/issue/reader.py +2 -3
- disdrodb/issue/writer.py +2 -5
- disdrodb/l0/__init__.py +2 -1
- disdrodb/l0/check_configs.py +36 -29
- disdrodb/l0/check_standards.py +1 -4
- disdrodb/l0/configs/LPM/l0a_encodings.yml +17 -17
- disdrodb/l0/configs/LPM/l0b_cf_attrs.yml +55 -55
- disdrodb/l0/configs/LPM/l0b_encodings.yml +17 -17
- disdrodb/l0/configs/LPM/raw_data_format.yml +17 -17
- disdrodb/l0/configs/LPM_V0/l0a_encodings.yml +2 -2
- disdrodb/l0/configs/LPM_V0/l0b_cf_attrs.yml +2 -2
- disdrodb/l0/configs/LPM_V0/l0b_encodings.yml +2 -2
- disdrodb/l0/configs/LPM_V0/raw_data_format.yml +2 -2
- 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/l0_reader.py +2 -3
- disdrodb/l0/l0a_processing.py +6 -8
- disdrodb/l0/l0b_nc_processing.py +3 -6
- disdrodb/l0/l0b_processing.py +2 -16
- disdrodb/l0/l0c_processing.py +29 -12
- disdrodb/l0/readers/LPM/ARM/ARM_LPM.py +2 -1
- disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +18 -18
- disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +18 -18
- disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +18 -18
- disdrodb/l0/readers/LPM/GERMANY/DWD.py +244 -63
- disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +65 -23
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_AQ.py +277 -0
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_PI.py +19 -18
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_T.py +23 -19
- disdrodb/l0/readers/LPM/ITALY/GID_LPM_W.py +19 -21
- disdrodb/l0/readers/LPM/KIT/CHWALA.py +19 -20
- disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_LPM_NC.py +1 -1
- disdrodb/l0/readers/LPM/NETHERLANDS/DELFT_RWANDA_LPM_NC.py +18 -18
- disdrodb/l0/readers/LPM/NORWAY/HAUKELISETER_LPM.py +19 -20
- disdrodb/l0/readers/LPM/NORWAY/NMBU_LPM.py +19 -20
- disdrodb/l0/readers/LPM/SLOVENIA/ARSO.py +19 -20
- disdrodb/l0/readers/LPM/SLOVENIA/UL.py +19 -20
- disdrodb/l0/readers/LPM/SWITZERLAND/INNERERIZ_LPM.py +19 -20
- disdrodb/l0/readers/LPM/UK/DIVEN.py +1 -1
- disdrodb/l0/readers/LPM/UK/WITHWORTH_LPM.py +19 -20
- disdrodb/l0/readers/LPM/USA/CHARLESTON.py +19 -20
- disdrodb/l0/readers/LPM/USA/DEVEX.py +255 -0
- disdrodb/l0/readers/LPM_V0/BELGIUM/ULIEGE.py +3 -5
- disdrodb/l0/readers/LPM_V0/ITALY/GID_LPM_V0.py +4 -3
- disdrodb/l0/readers/ODM470/OCEAN/OCEANRAIN.py +124 -0
- disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +1 -1
- disdrodb/l0/readers/PARSIVEL/BASQUECOUNTRY/EUSKALMET_OTT.py +2 -1
- disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +2 -3
- disdrodb/l0/readers/PARSIVEL/EPFL/ARCTIC_2021.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/COMMON_2011.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/DAVOS_2009_2011.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_2009.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2008.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2011.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2012.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GENEPI_2007.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/GRAND_ST_BERNARD_2007_2.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HPICONET_2010.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP2.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP4.py +2 -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 +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PARSIVEL_2007.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/PLATO_2019.py +1 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019_WJF.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/RIETHOLZBACH_2011.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +2 -1
- disdrodb/l0/readers/PARSIVEL/EPFL/UNIL_2022.py +2 -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 +1 -1
- disdrodb/l0/readers/PARSIVEL/NASA/MC3E.py +1 -1
- 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 +2 -1
- disdrodb/l0/readers/PARSIVEL2/ARM/ARM_PARSIVEL2.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/BASQUECOUNTRY/EUSKALMET_OTT2.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/BELGIUM/ILVO.py +2 -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 +2 -1
- disdrodb/l0/readers/PARSIVEL2/DENMARK/EROSION_raw.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/FINLAND/FMI_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/FRANCE/ENPC_PARSIVEL2.py +2 -3
- disdrodb/l0/readers/PARSIVEL2/FRANCE/OSUG.py +2 -2
- 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 +6 -3
- disdrodb/l0/readers/PARSIVEL2/JAPAN/PRECIP.py +1 -1
- 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/KOREA/ICEPOP_UCLM.py +126 -0
- disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/MPI/BCO_PARSIVEL2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/MPI/BOWTIE.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NASA/APU.py +3 -1
- disdrodb/l0/readers/PARSIVEL2/NASA/NSSTC.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/FARM_PARSIVEL2.py +2 -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 +2 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/PERILS_PIPS.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +1 -1
- 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 +2 -3
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT_NC.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/NORWAY/UIB.py +10 -2
- disdrodb/l0/readers/PARSIVEL2/PHILIPPINES/PAGASA.py +2 -3
- 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 +2 -3
- disdrodb/l0/readers/PARSIVEL2/SPAIN/LIAISE.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/SWEDEN/SMHI.py +2 -1
- disdrodb/l0/readers/PARSIVEL2/USA/CSU.py +1 -1
- disdrodb/l0/readers/PARSIVEL2/USA/CW3E.py +2 -1
- disdrodb/l0/readers/PWS100/AUSTRIA/HOAL.py +2 -3
- disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100.py +2 -3
- disdrodb/l0/readers/PWS100/FRANCE/ENPC_PWS100_SIRTA.py +2 -1
- disdrodb/l0/readers/RD80/BRAZIL/ATTO_RD80.py +1 -3
- 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 +2 -3
- disdrodb/l0/readers/SWS250/BELGIUM/KMI.py +2 -3
- disdrodb/l0/readers/template_reader_raw_netcdf_data.py +2 -3
- disdrodb/l0/readers/template_reader_raw_text_data.py +2 -3
- disdrodb/l0/standards.py +4 -5
- disdrodb/l0/template_tools.py +7 -11
- disdrodb/l1/__init__.py +2 -1
- disdrodb/l1/classification.py +914 -0
- disdrodb/l1/processing.py +36 -106
- disdrodb/l1/resampling.py +13 -3
- disdrodb/l1_env/__init__.py +1 -1
- disdrodb/l1_env/routines.py +7 -6
- disdrodb/l2/__init__.py +2 -1
- disdrodb/l2/empirical_dsd.py +58 -31
- disdrodb/l2/processing.py +327 -61
- disdrodb/metadata/checks.py +10 -13
- disdrodb/metadata/download.py +5 -4
- disdrodb/metadata/geolocation.py +3 -4
- disdrodb/metadata/info.py +3 -5
- disdrodb/metadata/manipulation.py +1 -3
- disdrodb/metadata/reader.py +1 -3
- disdrodb/metadata/search.py +1 -4
- disdrodb/metadata/standards.py +1 -3
- disdrodb/metadata/writer.py +1 -3
- disdrodb/physics/__init__.py +17 -0
- disdrodb/physics/atmosphere.py +273 -0
- disdrodb/physics/water.py +131 -0
- disdrodb/physics/wrappers.py +63 -0
- disdrodb/psd/__init__.py +1 -2
- disdrodb/psd/fitting.py +23 -9
- disdrodb/psd/models.py +2 -1
- disdrodb/routines/__init__.py +6 -1
- disdrodb/routines/l0.py +39 -25
- disdrodb/routines/l1.py +23 -16
- disdrodb/routines/l2.py +12 -9
- disdrodb/routines/options.py +117 -73
- disdrodb/routines/options_validation.py +728 -0
- disdrodb/routines/wrappers.py +460 -40
- disdrodb/scattering/__init__.py +1 -2
- disdrodb/scattering/axis_ratio.py +6 -6
- disdrodb/scattering/permittivity.py +9 -8
- disdrodb/scattering/routines.py +33 -15
- disdrodb/summary/__init__.py +1 -1
- disdrodb/summary/routines.py +95 -30
- disdrodb/utils/__init__.py +1 -1
- disdrodb/utils/archiving.py +18 -10
- disdrodb/utils/attrs.py +7 -5
- disdrodb/utils/cli.py +8 -10
- disdrodb/utils/compression.py +10 -13
- disdrodb/utils/coords.py +45 -0
- disdrodb/utils/dask.py +7 -5
- disdrodb/utils/dataframe.py +5 -6
- disdrodb/utils/decorators.py +3 -4
- disdrodb/utils/dict.py +1 -1
- disdrodb/utils/directories.py +5 -7
- disdrodb/utils/encoding.py +4 -5
- disdrodb/utils/event.py +1 -1
- disdrodb/utils/list.py +1 -3
- disdrodb/utils/logger.py +1 -3
- disdrodb/utils/manipulations.py +175 -4
- disdrodb/utils/pydantic.py +81 -0
- disdrodb/utils/routines.py +2 -3
- disdrodb/utils/subsetting.py +1 -1
- disdrodb/utils/time.py +6 -4
- disdrodb/utils/warnings.py +2 -3
- disdrodb/utils/writer.py +5 -3
- disdrodb/utils/xarray.py +31 -3
- disdrodb/utils/yaml.py +1 -3
- disdrodb/viz/__init__.py +1 -1
- disdrodb/viz/plots.py +193 -18
- {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/METADATA +5 -4
- disdrodb-0.4.0.dist-info/RECORD +361 -0
- {disdrodb-0.2.1.dist-info → disdrodb-0.4.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/LPM_V0/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 -662
- disdrodb/l1/filters.py +0 -205
- disdrodb-0.2.1.dist-info/RECORD +0 -329
- {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/WHEEL +0 -0
- {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/licenses/LICENSE +0 -0
- {disdrodb-0.2.1.dist-info → disdrodb-0.4.0.dist-info}/top_level.txt +0 -0
disdrodb/utils/cli.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
|
|
@@ -105,7 +103,7 @@ def click_data_archive_dir_option(function: object):
|
|
|
105
103
|
type=str,
|
|
106
104
|
show_default=True,
|
|
107
105
|
default=None,
|
|
108
|
-
help="DISDRODB
|
|
106
|
+
help="DISDRODB Data Archive Directory. Format: <...>/DISDRODB",
|
|
109
107
|
)(function)
|
|
110
108
|
return function
|
|
111
109
|
|
|
@@ -123,7 +121,7 @@ def click_metadata_archive_dir_option(function: object):
|
|
|
123
121
|
type=str,
|
|
124
122
|
show_default=True,
|
|
125
123
|
default=None,
|
|
126
|
-
help="DISDRODB Metadata Archive Directory",
|
|
124
|
+
help="DISDRODB Metadata Archive Directory. Format: <...>/DISDRODB-METADATA/DISDRODB",
|
|
127
125
|
)(function)
|
|
128
126
|
return function
|
|
129
127
|
|
|
@@ -233,14 +231,14 @@ def click_l0_archive_options(function: object):
|
|
|
233
231
|
type=bool,
|
|
234
232
|
show_default=True,
|
|
235
233
|
default=False,
|
|
236
|
-
help="If
|
|
234
|
+
help="If True, remove L0B files after L0C.",
|
|
237
235
|
)(function)
|
|
238
236
|
function = click.option(
|
|
239
237
|
"--remove_l0a",
|
|
240
238
|
type=bool,
|
|
241
239
|
show_default=True,
|
|
242
240
|
default=False,
|
|
243
|
-
help="If
|
|
241
|
+
help="If True, remove L0A files after L0B.",
|
|
244
242
|
)(function)
|
|
245
243
|
function = click.option(
|
|
246
244
|
"-l0c",
|
|
@@ -248,7 +246,7 @@ def click_l0_archive_options(function: object):
|
|
|
248
246
|
type=bool,
|
|
249
247
|
show_default=True,
|
|
250
248
|
default=True,
|
|
251
|
-
help="
|
|
249
|
+
help="Run L0C processing",
|
|
252
250
|
)(function)
|
|
253
251
|
function = click.option(
|
|
254
252
|
"-l0b",
|
|
@@ -256,7 +254,7 @@ def click_l0_archive_options(function: object):
|
|
|
256
254
|
type=bool,
|
|
257
255
|
show_default=True,
|
|
258
256
|
default=True,
|
|
259
|
-
help="
|
|
257
|
+
help="Run L0B processing",
|
|
260
258
|
)(function)
|
|
261
259
|
function = click.option(
|
|
262
260
|
"-l0a",
|
|
@@ -264,6 +262,6 @@ def click_l0_archive_options(function: object):
|
|
|
264
262
|
type=bool,
|
|
265
263
|
show_default=True,
|
|
266
264
|
default=True,
|
|
267
|
-
help="
|
|
265
|
+
help="Run L0A processing",
|
|
268
266
|
)(function)
|
|
269
267
|
return function
|
disdrodb/utils/compression.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
|
|
@@ -25,7 +23,6 @@ import shutil
|
|
|
25
23
|
import subprocess
|
|
26
24
|
import tempfile
|
|
27
25
|
import zipfile
|
|
28
|
-
from typing import Optional
|
|
29
26
|
|
|
30
27
|
from disdrodb.api.checks import check_data_archive_dir
|
|
31
28
|
from disdrodb.api.path import define_station_dir
|
|
@@ -190,13 +187,13 @@ def compress_station_files(
|
|
|
190
187
|
# Get list of files inside the station directory (in all nested directories)
|
|
191
188
|
filepaths = list_files(station_dir, recursive=True)
|
|
192
189
|
for filepath in filepaths:
|
|
193
|
-
_ =
|
|
190
|
+
_ = compress_file(filepath, method, skip=skip)
|
|
194
191
|
|
|
195
192
|
print(f"All files of {data_source} {campaign_name} {station_name} have been compressed.")
|
|
196
193
|
print("Please now remember to update the glob_pattern of the reader ¨!")
|
|
197
194
|
|
|
198
195
|
|
|
199
|
-
def
|
|
196
|
+
def compress_file(filepath: str, method: str, skip: bool) -> str:
|
|
200
197
|
"""Compress a file and delete the original.
|
|
201
198
|
|
|
202
199
|
If the file is already compressed, it is not compressed again.
|
|
@@ -230,9 +227,9 @@ def _compress_file(filepath: str, method: str, skip: bool) -> str:
|
|
|
230
227
|
archive_name = os.path.basename(filepath) + extension
|
|
231
228
|
compressed_filepath = os.path.join(os.path.dirname(filepath), archive_name)
|
|
232
229
|
compress_file_function = {
|
|
233
|
-
"zip":
|
|
234
|
-
"gzip":
|
|
235
|
-
"bzip2":
|
|
230
|
+
"zip": compress_file_zip,
|
|
231
|
+
"gzip": compress_file_gzip,
|
|
232
|
+
"bzip2": compress_file_bzip2,
|
|
236
233
|
}[method]
|
|
237
234
|
|
|
238
235
|
compress_file_function(filepath, compressed_filepath)
|
|
@@ -241,7 +238,7 @@ def _compress_file(filepath: str, method: str, skip: bool) -> str:
|
|
|
241
238
|
return compressed_filepath
|
|
242
239
|
|
|
243
240
|
|
|
244
|
-
def _check_file_compression(filepath: str) ->
|
|
241
|
+
def _check_file_compression(filepath: str) -> str | None:
|
|
245
242
|
"""Check the method used to compress a raw text file.
|
|
246
243
|
|
|
247
244
|
From https://stackoverflow.com/questions/13044562/python-mechanism-to-identify-compressed-file-type-and-uncompress
|
|
@@ -271,7 +268,7 @@ def _check_file_compression(filepath: str) -> Optional[str]:
|
|
|
271
268
|
return None
|
|
272
269
|
|
|
273
270
|
|
|
274
|
-
def
|
|
271
|
+
def compress_file_zip(filepath: str, compressed_filepath: str) -> None:
|
|
275
272
|
"""Compress a single file into a zip archive.
|
|
276
273
|
|
|
277
274
|
Parameters
|
|
@@ -287,7 +284,7 @@ def _compress_file_zip(filepath: str, compressed_filepath: str) -> None:
|
|
|
287
284
|
zipf.write(filepath, os.path.basename(filepath))
|
|
288
285
|
|
|
289
286
|
|
|
290
|
-
def
|
|
287
|
+
def compress_file_gzip(filepath: str, compressed_filepath: str) -> None:
|
|
291
288
|
"""Compress a single file into a gzip archive.
|
|
292
289
|
|
|
293
290
|
Parameters
|
|
@@ -303,7 +300,7 @@ def _compress_file_gzip(filepath: str, compressed_filepath: str) -> None:
|
|
|
303
300
|
f_out.writelines(f_in)
|
|
304
301
|
|
|
305
302
|
|
|
306
|
-
def
|
|
303
|
+
def compress_file_bzip2(filepath: str, compressed_filepath: str) -> None:
|
|
307
304
|
"""Compress a single file into a bzip2 archive.
|
|
308
305
|
|
|
309
306
|
Parameters
|
disdrodb/utils/coords.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# -----------------------------------------------------------------------------.
|
|
2
|
+
# Copyright (c) 2021-2026 DISDRODB developers
|
|
3
|
+
#
|
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
# -----------------------------------------------------------------------------.
|
|
17
|
+
"""DISDRODB coordinates utilities."""
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def add_dataset_crs_coords(xr_obj):
|
|
21
|
+
"""Add a CF-compliant CRS (WGS84) to an xarray.Dataset."""
|
|
22
|
+
import xarray as xr
|
|
23
|
+
|
|
24
|
+
crs_wkt = (
|
|
25
|
+
'GEOGCRS["WGS 84",'
|
|
26
|
+
'DATUM["World Geodetic System 1984",'
|
|
27
|
+
'ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]],'
|
|
28
|
+
'PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]],'
|
|
29
|
+
"CS[ellipsoidal,2],"
|
|
30
|
+
'AXIS["geodetic latitude",north, ANGLEUNIT["degree",0.0174532925199433]],'
|
|
31
|
+
'AXIS["geodetic longitude",east, ANGLEUNIT["degree",0.0174532925199433]],'
|
|
32
|
+
'UNIT["degree",0.0174532925199433]'
|
|
33
|
+
)
|
|
34
|
+
da_crs = xr.DataArray(
|
|
35
|
+
0,
|
|
36
|
+
attrs={
|
|
37
|
+
"grid_mapping_name": "latitude_longitude",
|
|
38
|
+
"crs_wkt": crs_wkt,
|
|
39
|
+
"epsg_code": "EPSG:4326",
|
|
40
|
+
"semi_major_axis": 6378137.0,
|
|
41
|
+
"inverse_flattening": 298.257223563,
|
|
42
|
+
"longitude_of_prime_meridian": 0.0,
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
return xr_obj.assign_coords({"crs": da_crs})
|
disdrodb/utils/dask.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
|
|
@@ -17,6 +15,7 @@
|
|
|
17
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
16
|
# -----------------------------------------------------------------------------.
|
|
19
17
|
"""Utilities for Dask Distributed Computations."""
|
|
18
|
+
|
|
20
19
|
import logging
|
|
21
20
|
import os
|
|
22
21
|
|
|
@@ -30,9 +29,9 @@ def check_parallel_validity(parallel):
|
|
|
30
29
|
scheduler = dask.config.get("scheduler", None)
|
|
31
30
|
if scheduler is None:
|
|
32
31
|
return parallel
|
|
33
|
-
if scheduler in ["synchronous", "threads"]:
|
|
32
|
+
if scheduler in ["synchronous", "threads", "single-threaded"]:
|
|
34
33
|
return False
|
|
35
|
-
if scheduler
|
|
34
|
+
if scheduler in ["distributed", "dask.distributed"]:
|
|
36
35
|
from dask.distributed import default_client
|
|
37
36
|
|
|
38
37
|
client = default_client()
|
|
@@ -62,6 +61,8 @@ def initialize_dask_cluster(minimum_memory=None):
|
|
|
62
61
|
import psutil
|
|
63
62
|
|
|
64
63
|
# Silence dask warnings
|
|
64
|
+
# dask.config.set({'distributed.worker.multiprocessing-method': 'forkserver'})
|
|
65
|
+
# dask.config.set({"distributed.worker.multiprocessing-method": "spawn"})
|
|
65
66
|
# dask.config.set({"logging.distributed": "error"})
|
|
66
67
|
# Import dask.distributed after setting the config
|
|
67
68
|
from dask.distributed import Client, LocalCluster
|
|
@@ -71,6 +72,7 @@ def initialize_dask_cluster(minimum_memory=None):
|
|
|
71
72
|
os.environ["HDF5_USE_FILE_LOCKING"] = "FALSE"
|
|
72
73
|
|
|
73
74
|
# Retrieve the number of processes to run
|
|
75
|
+
# --> If DASK_NUM_WORKERS is not set, use all CPUs minus 2
|
|
74
76
|
available_workers = os.cpu_count() - 2 # if not set, all CPUs minus 2
|
|
75
77
|
num_workers = dask.config.get("num_workers", available_workers)
|
|
76
78
|
|
disdrodb/utils/dataframe.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
|
|
@@ -17,6 +15,7 @@
|
|
|
17
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
16
|
# -----------------------------------------------------------------------------.
|
|
19
17
|
"""Dataframe utilities."""
|
|
18
|
+
|
|
20
19
|
import numpy as np
|
|
21
20
|
import pandas as pd
|
|
22
21
|
|
|
@@ -209,7 +208,7 @@ def compute_1d_histogram(df, column, variables=None, bins=10, labels=None, prefi
|
|
|
209
208
|
|
|
210
209
|
# Reset index and add coordinates/labels
|
|
211
210
|
df_stats = df_stats.reset_index()
|
|
212
|
-
df_stats[f"{column}"] = pd.Categorical(df_stats[f"{column}_binned"].map(dict(zip(intervals, coords, strict=
|
|
211
|
+
df_stats[f"{column}"] = pd.Categorical(df_stats[f"{column}_binned"].map(dict(zip(intervals, coords, strict=True))))
|
|
213
212
|
df_stats = df_stats.drop(columns=f"{column}_binned")
|
|
214
213
|
|
|
215
214
|
return df_stats
|
|
@@ -375,8 +374,8 @@ def compute_2d_histogram(
|
|
|
375
374
|
|
|
376
375
|
# Reset index and set new coordinates
|
|
377
376
|
df_stats = df_stats.reset_index()
|
|
378
|
-
df_stats[f"{x}"] = pd.Categorical(df_stats[f"{x}_binned"].map(dict(zip(x_intervals, x_coords, strict=
|
|
379
|
-
df_stats[f"{y}"] = pd.Categorical(df_stats[f"{y}_binned"].map(dict(zip(y_intervals, y_coords, strict=
|
|
377
|
+
df_stats[f"{x}"] = pd.Categorical(df_stats[f"{x}_binned"].map(dict(zip(x_intervals, x_coords, strict=True))))
|
|
378
|
+
df_stats[f"{y}"] = pd.Categorical(df_stats[f"{y}_binned"].map(dict(zip(y_intervals, y_coords, strict=True))))
|
|
380
379
|
|
|
381
380
|
# Set new MultiIndex with coordinates
|
|
382
381
|
df_stats = df_stats.set_index([f"{x}", f"{y}"])
|
disdrodb/utils/decorators.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
|
|
@@ -17,6 +15,7 @@
|
|
|
17
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
16
|
# -----------------------------------------------------------------------------.
|
|
19
17
|
"""DISDRODB decorators."""
|
|
18
|
+
|
|
20
19
|
import functools
|
|
21
20
|
import importlib
|
|
22
21
|
import uuid
|
|
@@ -86,7 +85,7 @@ def single_threaded_if_parallel(function):
|
|
|
86
85
|
if parallel:
|
|
87
86
|
# Call function with single thread
|
|
88
87
|
# with dask.config.set(scheduler='single-threaded'):
|
|
89
|
-
with dask.config.set(scheduler="
|
|
88
|
+
with dask.config.set(scheduler="single-threaded"): # "synchronous"
|
|
90
89
|
result = function(*args, **kwargs)
|
|
91
90
|
else:
|
|
92
91
|
# Else run the function as usual
|
disdrodb/utils/dict.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
|
disdrodb/utils/directories.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
|
|
@@ -17,13 +15,13 @@
|
|
|
17
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
16
|
# -----------------------------------------------------------------------------.
|
|
19
17
|
"""Define utilities for Directory/File Checks/Creation/Deletion."""
|
|
18
|
+
|
|
20
19
|
import glob
|
|
21
20
|
import logging
|
|
22
21
|
import os
|
|
23
22
|
import pathlib
|
|
24
23
|
import shutil
|
|
25
24
|
import subprocess
|
|
26
|
-
from typing import Union
|
|
27
25
|
|
|
28
26
|
from disdrodb.utils.list import flatten_list
|
|
29
27
|
from disdrodb.utils.logger import log_info
|
|
@@ -81,7 +79,7 @@ def check_glob_pattern(pattern: str) -> None:
|
|
|
81
79
|
return pattern
|
|
82
80
|
|
|
83
81
|
|
|
84
|
-
def check_glob_patterns(patterns:
|
|
82
|
+
def check_glob_patterns(patterns: str | list) -> list:
|
|
85
83
|
"""Check if glob patterns are valids."""
|
|
86
84
|
if not isinstance(patterns, (str, list)):
|
|
87
85
|
raise ValueError("'glob_patterns' must be a str or list of strings.")
|
|
@@ -212,7 +210,7 @@ def is_empty_directory(path, skip_hidden=True):
|
|
|
212
210
|
return len(paths) == 0
|
|
213
211
|
|
|
214
212
|
|
|
215
|
-
def
|
|
213
|
+
def remove_file_or_directories(path, logger=None):
|
|
216
214
|
"""Return the file/directory or subdirectories tree of ``path``.
|
|
217
215
|
|
|
218
216
|
Use this function with caution.
|
|
@@ -259,7 +257,7 @@ def remove_if_exists(path: str, force: bool = False, logger=None) -> None:
|
|
|
259
257
|
|
|
260
258
|
# If force=True, remove the file/directory or subdirectories and files !
|
|
261
259
|
try:
|
|
262
|
-
|
|
260
|
+
remove_file_or_directories(path, logger=logger)
|
|
263
261
|
except Exception as e:
|
|
264
262
|
msg = f"Can not delete file(s) at {path}. The error is: {e}"
|
|
265
263
|
raise ValueError(msg)
|
disdrodb/utils/encoding.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
|
|
@@ -17,6 +15,7 @@
|
|
|
17
15
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
16
|
# -----------------------------------------------------------------------------.
|
|
19
17
|
"""DISDRODB netCDF4 encoding utilities."""
|
|
18
|
+
|
|
20
19
|
import os
|
|
21
20
|
|
|
22
21
|
import numpy as np
|
|
@@ -128,7 +127,7 @@ def rechunk_dataset(ds: xr.Dataset, encodings_dict: dict) -> xr.Dataset:
|
|
|
128
127
|
chunks = encodings_dict[var].get("chunksizes", None) # .pop("chunksizes", None)
|
|
129
128
|
if chunks is not None:
|
|
130
129
|
dims = list(ds[var].dims)
|
|
131
|
-
chunks_dict = dict(zip(dims, chunks))
|
|
130
|
+
chunks_dict = dict(zip(dims, chunks, strict=True))
|
|
132
131
|
ds[var] = ds[var].chunk(chunks_dict)
|
|
133
132
|
ds[var].encoding["chunksizes"] = chunks
|
|
134
133
|
return ds
|
|
@@ -144,7 +143,7 @@ def get_time_encoding() -> dict:
|
|
|
144
143
|
"""
|
|
145
144
|
encoding = {}
|
|
146
145
|
encoding["dtype"] = "int64" # if float trailing sub-seconds values
|
|
147
|
-
encoding["
|
|
146
|
+
encoding["_FillValue"] = np.iinfo(np.int64).max
|
|
148
147
|
encoding["units"] = EPOCH
|
|
149
148
|
encoding["calendar"] = "proleptic_gregorian"
|
|
150
149
|
return encoding
|
disdrodb/utils/event.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
|
disdrodb/utils/list.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/utils/logger.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/utils/manipulations.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
|
|
@@ -19,11 +17,184 @@
|
|
|
19
17
|
"""Include functions helping for DISDRODB product manipulations."""
|
|
20
18
|
|
|
21
19
|
import numpy as np
|
|
20
|
+
import xarray as xr
|
|
22
21
|
|
|
23
|
-
from disdrodb.constants import DIAMETER_DIMENSION
|
|
22
|
+
from disdrodb.constants import DIAMETER_DIMENSION, VELOCITY_DIMENSION
|
|
24
23
|
from disdrodb.utils.xarray import unstack_datarray_dimension
|
|
25
24
|
|
|
26
25
|
|
|
26
|
+
def define_diameter_datarray(bounds):
|
|
27
|
+
"""Define diameter DataArray."""
|
|
28
|
+
diameters_bin_lower = bounds[:-1]
|
|
29
|
+
diameters_bin_upper = bounds[1:]
|
|
30
|
+
diameters_bin_width = diameters_bin_upper - diameters_bin_lower
|
|
31
|
+
diameters_bin_center = diameters_bin_lower + diameters_bin_width / 2
|
|
32
|
+
da = xr.DataArray(
|
|
33
|
+
diameters_bin_center,
|
|
34
|
+
dims="diameter_bin_center",
|
|
35
|
+
coords={
|
|
36
|
+
"diameter_bin_width": ("diameter_bin_center", diameters_bin_width),
|
|
37
|
+
"diameter_bin_lower": ("diameter_bin_center", diameters_bin_lower),
|
|
38
|
+
"diameter_bin_upper": ("diameter_bin_center", diameters_bin_upper),
|
|
39
|
+
"diameter_bin_center": ("diameter_bin_center", diameters_bin_center),
|
|
40
|
+
},
|
|
41
|
+
)
|
|
42
|
+
return da
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def define_velocity_datarray(bounds):
|
|
46
|
+
"""Define velocity DataArray."""
|
|
47
|
+
velocitys_bin_lower = bounds[:-1]
|
|
48
|
+
velocitys_bin_upper = bounds[1:]
|
|
49
|
+
velocitys_bin_width = velocitys_bin_upper - velocitys_bin_lower
|
|
50
|
+
velocitys_bin_center = velocitys_bin_lower + velocitys_bin_width / 2
|
|
51
|
+
da = xr.DataArray(
|
|
52
|
+
velocitys_bin_center,
|
|
53
|
+
dims="velocity_bin_center",
|
|
54
|
+
coords={
|
|
55
|
+
"velocity_bin_width": ("velocity_bin_center", velocitys_bin_width),
|
|
56
|
+
"velocity_bin_lower": ("velocity_bin_center", velocitys_bin_lower),
|
|
57
|
+
"velocity_bin_upper": ("velocity_bin_center", velocitys_bin_upper),
|
|
58
|
+
"velocity_bin_center": ("velocity_bin_center", velocitys_bin_center),
|
|
59
|
+
},
|
|
60
|
+
)
|
|
61
|
+
return da
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def define_diameter_array(diameter_min=0, diameter_max=10, diameter_spacing=0.05):
|
|
65
|
+
"""
|
|
66
|
+
Define an array of diameters and their corresponding bin properties.
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
diameter_min : float, optional
|
|
71
|
+
The minimum diameter value. The default value is 0 mm.
|
|
72
|
+
diameter_max : float, optional
|
|
73
|
+
The maximum diameter value. The default value is 10 mm.
|
|
74
|
+
diameter_spacing : float, optional
|
|
75
|
+
The spacing between diameter values. The default value is 0.05 mm.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
xr.DataArray
|
|
80
|
+
A DataArray containing the center of each diameter bin, with coordinates for
|
|
81
|
+
the bin width, lower bound, upper bound, and center.
|
|
82
|
+
|
|
83
|
+
"""
|
|
84
|
+
diameters_bounds = np.arange(diameter_min, diameter_max + diameter_spacing / 2, step=diameter_spacing)
|
|
85
|
+
return define_diameter_datarray(diameters_bounds)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def define_velocity_array(velocity_min=0, velocity_max=10, velocity_spacing=0.05):
|
|
89
|
+
"""
|
|
90
|
+
Define an array of velocities and their corresponding bin properties.
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
----------
|
|
94
|
+
velocity_min : float, optional
|
|
95
|
+
The minimum velocity value. The default value is 0 mm.
|
|
96
|
+
velocity_max : float, optional
|
|
97
|
+
The maximum velocity value. The default value is 10 mm.
|
|
98
|
+
velocity_spacing : float, optional
|
|
99
|
+
The spacing between velocity values. The default value is 0.05 mm.
|
|
100
|
+
|
|
101
|
+
Returns
|
|
102
|
+
-------
|
|
103
|
+
xr.DataArray
|
|
104
|
+
A DataArray containing the center of each velocity bin, with coordinates for
|
|
105
|
+
the bin width, lower bound, upper bound, and center.
|
|
106
|
+
|
|
107
|
+
"""
|
|
108
|
+
velocitys_bounds = np.arange(velocity_min, velocity_max + velocity_spacing / 2, step=velocity_spacing)
|
|
109
|
+
return define_velocity_datarray(velocitys_bounds)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def filter_diameter_bins(ds, minimum_diameter=None, maximum_diameter=None):
|
|
113
|
+
"""
|
|
114
|
+
Filter the dataset to include only diameter bins within specified bounds.
|
|
115
|
+
|
|
116
|
+
Parameters
|
|
117
|
+
----------
|
|
118
|
+
ds : xarray.Dataset
|
|
119
|
+
The dataset containing diameter bin data.
|
|
120
|
+
minimum_diameter : float, optional
|
|
121
|
+
The minimum diameter to be included, in millimeters.
|
|
122
|
+
Defaults to the minimum value in `ds["diameter_bin_lower"]`.
|
|
123
|
+
maximum_diameter : float, optional
|
|
124
|
+
The maximum diameter to be included, in millimeters.
|
|
125
|
+
Defaults to the maximum value in `ds["diameter_bin_upper"]`.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
xarray.Dataset
|
|
130
|
+
The filtered dataset containing only the specified diameter bins.
|
|
131
|
+
"""
|
|
132
|
+
# Put data into memory
|
|
133
|
+
ds["diameter_bin_lower"] = ds["diameter_bin_lower"].compute()
|
|
134
|
+
ds["diameter_bin_upper"] = ds["diameter_bin_upper"].compute()
|
|
135
|
+
|
|
136
|
+
# Initialize default arguments
|
|
137
|
+
if minimum_diameter is None:
|
|
138
|
+
minimum_diameter = ds["diameter_bin_lower"].min().item()
|
|
139
|
+
if maximum_diameter is None:
|
|
140
|
+
maximum_diameter = ds["diameter_bin_upper"].max().item()
|
|
141
|
+
|
|
142
|
+
# Select bins which overlap the specified diameters
|
|
143
|
+
valid_indices = np.logical_and(
|
|
144
|
+
ds["diameter_bin_upper"] > minimum_diameter,
|
|
145
|
+
ds["diameter_bin_lower"] < maximum_diameter,
|
|
146
|
+
)
|
|
147
|
+
ds = ds.isel({DIAMETER_DIMENSION: valid_indices})
|
|
148
|
+
|
|
149
|
+
if ds.sizes[DIAMETER_DIMENSION] == 0:
|
|
150
|
+
msg = f"Filtering using {minimum_diameter=} removes all diameter bins."
|
|
151
|
+
raise ValueError(msg)
|
|
152
|
+
return ds
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def filter_velocity_bins(ds, minimum_velocity=None, maximum_velocity=None):
|
|
156
|
+
"""
|
|
157
|
+
Filter the dataset to include only velocity bins within specified bounds.
|
|
158
|
+
|
|
159
|
+
Parameters
|
|
160
|
+
----------
|
|
161
|
+
ds : xarray.Dataset
|
|
162
|
+
The dataset containing velocity bin data.
|
|
163
|
+
minimum_velocity : float, optional
|
|
164
|
+
The minimum velocity to include in the filter, in meters per second.
|
|
165
|
+
Defaults to the minimum value in `ds["velocity_bin_lower"]`.
|
|
166
|
+
maximum_velocity : float, optional
|
|
167
|
+
The maximum velocity to include in the filter, in meters per second.
|
|
168
|
+
Defaults to the maximum value in `ds["velocity_bin_upper"]`.
|
|
169
|
+
|
|
170
|
+
Returns
|
|
171
|
+
-------
|
|
172
|
+
xarray.Dataset
|
|
173
|
+
The filtered dataset containing only the specified velocity bins.
|
|
174
|
+
"""
|
|
175
|
+
# Put data into memory
|
|
176
|
+
ds["velocity_bin_lower"] = ds["velocity_bin_lower"].compute()
|
|
177
|
+
ds["velocity_bin_upper"] = ds["velocity_bin_upper"].compute()
|
|
178
|
+
|
|
179
|
+
# Initialize default arguments
|
|
180
|
+
if minimum_velocity is None:
|
|
181
|
+
minimum_velocity = ds["velocity_bin_lower"].min().item()
|
|
182
|
+
if maximum_velocity is None:
|
|
183
|
+
maximum_velocity = ds["velocity_bin_upper"].max().item()
|
|
184
|
+
|
|
185
|
+
# Select bins which overlap the specified velocities
|
|
186
|
+
valid_indices = np.logical_and(
|
|
187
|
+
ds["velocity_bin_upper"] > minimum_velocity,
|
|
188
|
+
ds["velocity_bin_lower"] < maximum_velocity,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
ds = ds.isel({VELOCITY_DIMENSION: valid_indices})
|
|
192
|
+
if ds.sizes[VELOCITY_DIMENSION] == 0:
|
|
193
|
+
msg = f"Filtering using {minimum_velocity=} removes all velocity bins."
|
|
194
|
+
raise ValueError(msg)
|
|
195
|
+
return ds
|
|
196
|
+
|
|
197
|
+
|
|
27
198
|
def get_diameter_bin_edges(ds):
|
|
28
199
|
"""Retrieve diameter bin edges."""
|
|
29
200
|
bin_edges = np.append(ds["diameter_bin_lower"].to_numpy(), ds["diameter_bin_upper"].to_numpy()[-1])
|