disdrodb 0.0.21__py3-none-any.whl → 0.1.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 +132 -15
- disdrodb/_config.py +4 -2
- disdrodb/_version.py +9 -4
- disdrodb/api/checks.py +264 -237
- disdrodb/api/configs.py +4 -8
- disdrodb/api/create_directories.py +235 -290
- disdrodb/api/info.py +217 -26
- disdrodb/api/io.py +295 -269
- disdrodb/api/path.py +597 -173
- disdrodb/api/search.py +486 -0
- disdrodb/{metadata/scripts → cli}/disdrodb_check_metadata_archive.py +12 -7
- disdrodb/{utils/pandas.py → cli/disdrodb_data_archive_directory.py} +9 -18
- disdrodb/cli/disdrodb_download_archive.py +86 -0
- disdrodb/cli/disdrodb_download_metadata_archive.py +53 -0
- disdrodb/cli/disdrodb_download_station.py +84 -0
- disdrodb/{api/scripts → cli}/disdrodb_initialize_station.py +22 -10
- disdrodb/cli/disdrodb_metadata_archive_directory.py +32 -0
- disdrodb/{data_transfer/scripts/disdrodb_download_station.py → cli/disdrodb_open_data_archive.py} +22 -22
- disdrodb/cli/disdrodb_open_logs_directory.py +69 -0
- disdrodb/{data_transfer/scripts/disdrodb_upload_station.py → cli/disdrodb_open_metadata_archive.py} +22 -24
- disdrodb/cli/disdrodb_open_metadata_directory.py +71 -0
- disdrodb/cli/disdrodb_open_product_directory.py +74 -0
- disdrodb/cli/disdrodb_open_readers_directory.py +32 -0
- disdrodb/{l0/scripts → cli}/disdrodb_run_l0.py +38 -31
- disdrodb/{l0/scripts → cli}/disdrodb_run_l0_station.py +32 -30
- disdrodb/{l0/scripts → cli}/disdrodb_run_l0a.py +30 -21
- disdrodb/{l0/scripts → cli}/disdrodb_run_l0a_station.py +24 -33
- disdrodb/{l0/scripts → cli}/disdrodb_run_l0b.py +30 -21
- disdrodb/{l0/scripts → cli}/disdrodb_run_l0b_station.py +25 -34
- disdrodb/cli/disdrodb_run_l0c.py +130 -0
- disdrodb/cli/disdrodb_run_l0c_station.py +129 -0
- disdrodb/cli/disdrodb_run_l1.py +122 -0
- disdrodb/cli/disdrodb_run_l1_station.py +121 -0
- disdrodb/cli/disdrodb_run_l2e.py +122 -0
- disdrodb/cli/disdrodb_run_l2e_station.py +122 -0
- disdrodb/cli/disdrodb_run_l2m.py +122 -0
- disdrodb/cli/disdrodb_run_l2m_station.py +122 -0
- disdrodb/cli/disdrodb_upload_archive.py +105 -0
- disdrodb/cli/disdrodb_upload_station.py +98 -0
- disdrodb/configs.py +90 -25
- disdrodb/data_transfer/__init__.py +22 -0
- disdrodb/data_transfer/download_data.py +87 -90
- disdrodb/data_transfer/upload_data.py +64 -37
- disdrodb/data_transfer/zenodo.py +15 -18
- disdrodb/docs.py +1 -1
- disdrodb/issue/__init__.py +17 -4
- disdrodb/issue/checks.py +10 -23
- disdrodb/issue/reader.py +9 -12
- disdrodb/issue/writer.py +14 -17
- disdrodb/l0/__init__.py +17 -26
- disdrodb/l0/check_configs.py +35 -23
- disdrodb/l0/check_standards.py +32 -42
- disdrodb/l0/configs/{Thies_LPM → LPM}/bins_diameter.yml +44 -44
- disdrodb/l0/configs/{Thies_LPM → LPM}/bins_velocity.yml +40 -40
- disdrodb/l0/configs/LPM/l0a_encodings.yml +80 -0
- disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_cf_attrs.yml +62 -59
- disdrodb/l0/configs/{Thies_LPM → LPM}/l0b_encodings.yml +9 -9
- disdrodb/l0/configs/{Thies_LPM → LPM}/raw_data_format.yml +245 -245
- disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/bins_diameter.yml +66 -66
- disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/bins_velocity.yml +64 -64
- disdrodb/l0/configs/PARSIVEL/l0a_encodings.yml +32 -0
- disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/l0b_cf_attrs.yml +22 -20
- disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/l0b_encodings.yml +17 -17
- disdrodb/l0/configs/{OTT_Parsivel → PARSIVEL}/raw_data_format.yml +77 -77
- disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/bins_diameter.yml +64 -64
- disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/bins_velocity.yml +64 -64
- disdrodb/l0/configs/PARSIVEL2/l0a_encodings.yml +39 -0
- disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_cf_attrs.yml +24 -22
- disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/l0b_encodings.yml +20 -20
- disdrodb/l0/configs/{OTT_Parsivel2 → PARSIVEL2}/raw_data_format.yml +98 -98
- disdrodb/l0/configs/{RD_80 → RD80}/bins_diameter.yml +40 -40
- disdrodb/l0/configs/RD80/l0a_encodings.yml +16 -0
- disdrodb/l0/configs/{RD_80 → RD80}/l0b_cf_attrs.yml +3 -3
- disdrodb/l0/configs/RD80/l0b_encodings.yml +135 -0
- disdrodb/l0/configs/{RD_80 → RD80}/raw_data_format.yml +48 -48
- disdrodb/l0/l0_reader.py +216 -340
- disdrodb/l0/l0a_processing.py +237 -208
- disdrodb/l0/l0b_nc_processing.py +227 -80
- disdrodb/l0/l0b_processing.py +93 -173
- disdrodb/l0/l0c_processing.py +627 -0
- disdrodb/l0/readers/{ARM → LPM/ARM}/ARM_LPM.py +36 -58
- disdrodb/l0/readers/LPM/AUSTRALIA/MELBOURNE_2007_LPM.py +226 -0
- disdrodb/l0/readers/LPM/BRAZIL/CHUVA_LPM.py +185 -0
- disdrodb/l0/readers/LPM/BRAZIL/GOAMAZON_LPM.py +183 -0
- disdrodb/l0/readers/LPM/ITALY/GID_LPM.py +179 -0
- disdrodb/l0/readers/{UK → LPM/UK}/DIVEN.py +14 -35
- disdrodb/l0/readers/PARSIVEL/AUSTRALIA/MELBOURNE_2007_PARSIVEL.py +157 -0
- disdrodb/l0/readers/PARSIVEL/CHINA/CHONGQING.py +113 -0
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/ARCTIC_2021.py +40 -57
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/COMMON_2011.py +37 -54
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/DAVOS_2009_2011.py +34 -51
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_2009.py +34 -51
- disdrodb/l0/readers/{EPFL/PARADISO_2014.py → PARSIVEL/EPFL/EPFL_ROOF_2008.py} +38 -50
- disdrodb/l0/readers/PARSIVEL/EPFL/EPFL_ROOF_2010.py +105 -0
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2011.py +34 -51
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/EPFL_ROOF_2012.py +33 -51
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GENEPI_2007.py +25 -44
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007.py +25 -44
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/GRAND_ST_BERNARD_2007_2.py +25 -44
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HPICONET_2010.py +34 -51
- disdrodb/l0/readers/{EPFL/EPFL_ROOF_2010.py → PARSIVEL/EPFL/HYMEX_LTE_SOP2.py} +37 -50
- disdrodb/l0/readers/PARSIVEL/EPFL/HYMEX_LTE_SOP3.py +111 -0
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/HYMEX_LTE_SOP4.py +36 -54
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2018.py +34 -52
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/LOCARNO_2019.py +38 -56
- disdrodb/l0/readers/PARSIVEL/EPFL/PARADISO_2014.py +105 -0
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PARSIVEL_2007.py +27 -45
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/PLATO_2019.py +24 -44
- disdrodb/l0/readers/PARSIVEL/EPFL/RACLETS_2019.py +140 -0
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RACLETS_2019_WJF.py +41 -59
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/RIETHOLZBACH_2011.py +34 -51
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2017.py +117 -0
- disdrodb/l0/readers/PARSIVEL/EPFL/SAMOYLOV_2019.py +137 -0
- disdrodb/l0/readers/{EPFL → PARSIVEL/EPFL}/UNIL_2022.py +42 -55
- disdrodb/l0/readers/PARSIVEL/GPM/IFLOODS.py +104 -0
- disdrodb/l0/readers/{GPM → PARSIVEL/GPM}/LPVEX.py +29 -48
- disdrodb/l0/readers/PARSIVEL/GPM/MC3E.py +184 -0
- disdrodb/l0/readers/PARSIVEL/NCAR/CCOPE_2015.py +113 -0
- disdrodb/l0/readers/{NCAR/VORTEX_SE_2016_P1.py → PARSIVEL/NCAR/OWLES_MIPS.py} +46 -72
- disdrodb/l0/readers/PARSIVEL/NCAR/PECAN_MOBILE.py +125 -0
- disdrodb/l0/readers/{NCAR/OWLES_MIPS.py → PARSIVEL/NCAR/PLOWS_MIPS.py} +45 -64
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2009.py +114 -0
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010.py +176 -0
- disdrodb/l0/readers/PARSIVEL/NCAR/VORTEX2_2010_UF.py +183 -0
- disdrodb/l0/readers/{ARM/ARM_LD.py → PARSIVEL2/ARM/ARM_PARSIVEL2.py} +27 -50
- disdrodb/l0/readers/PARSIVEL2/BRAZIL/CHUVA_PARSIVEL2.py +163 -0
- disdrodb/l0/readers/PARSIVEL2/BRAZIL/GOAMAZON_PARSIVEL2.py +163 -0
- disdrodb/l0/readers/{DENMARK → PARSIVEL2/DENMARK}/EROSION_nc.py +14 -35
- disdrodb/l0/readers/PARSIVEL2/FRANCE/SIRTA_PARSIVEL2.py +119 -0
- disdrodb/l0/readers/PARSIVEL2/GPM/GCPEX.py +104 -0
- disdrodb/l0/readers/PARSIVEL2/GPM/NSSTC.py +176 -0
- disdrodb/l0/readers/PARSIVEL2/ITALY/GID_PARSIVEL2.py +32 -0
- disdrodb/l0/readers/PARSIVEL2/MEXICO/OH_IIUNAM_nc.py +56 -0
- disdrodb/l0/readers/PARSIVEL2/NCAR/PECAN_FP3.py +120 -0
- disdrodb/l0/readers/{NCAR → PARSIVEL2/NCAR}/PECAN_MIPS.py +45 -64
- disdrodb/l0/readers/PARSIVEL2/NCAR/RELAMPAGO_PARSIVEL2.py +181 -0
- disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_PJ.py +160 -0
- disdrodb/l0/readers/PARSIVEL2/NCAR/SNOWIE_SB.py +160 -0
- disdrodb/l0/readers/{NCAR/PLOWS_MIPS.py → PARSIVEL2/NCAR/VORTEX_SE_2016_P1.py} +49 -66
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_P2.py +118 -0
- disdrodb/l0/readers/PARSIVEL2/NCAR/VORTEX_SE_2016_PIPS.py +152 -0
- disdrodb/l0/readers/PARSIVEL2/NETHERLANDS/DELFT.py +166 -0
- disdrodb/l0/readers/{NCAR/RELAMPAGO_RD80.py → RD80/BRAZIL/CHUVA_RD80.py} +36 -60
- disdrodb/l0/readers/{BRAZIL → RD80/BRAZIL}/GOAMAZON_RD80.py +36 -55
- disdrodb/l0/readers/{NCAR → RD80/NCAR}/CINDY_2011_RD80.py +35 -54
- disdrodb/l0/readers/{BRAZIL/CHUVA_RD80.py → RD80/NCAR/RELAMPAGO_RD80.py} +40 -54
- disdrodb/l0/readers/template_reader_raw_netcdf_data.py +62 -0
- disdrodb/l0/readers/{reader_template.py → template_reader_raw_text_data.py} +20 -44
- disdrodb/l0/routines.py +885 -581
- disdrodb/l0/standards.py +72 -236
- disdrodb/l0/template_tools.py +104 -109
- disdrodb/l1/__init__.py +17 -0
- disdrodb/l1/beard_model.py +716 -0
- disdrodb/l1/encoding_attrs.py +620 -0
- disdrodb/l1/fall_velocity.py +260 -0
- disdrodb/l1/filters.py +192 -0
- disdrodb/l1/processing.py +200 -0
- disdrodb/l1/resampling.py +236 -0
- disdrodb/l1/routines.py +357 -0
- disdrodb/l1_env/__init__.py +17 -0
- disdrodb/l1_env/routines.py +38 -0
- disdrodb/l2/__init__.py +17 -0
- disdrodb/l2/empirical_dsd.py +1735 -0
- disdrodb/l2/event.py +388 -0
- disdrodb/l2/processing.py +519 -0
- disdrodb/l2/processing_options.py +213 -0
- disdrodb/l2/routines.py +868 -0
- disdrodb/metadata/__init__.py +9 -2
- disdrodb/metadata/checks.py +165 -118
- disdrodb/metadata/download.py +81 -0
- disdrodb/metadata/geolocation.py +146 -0
- disdrodb/metadata/info.py +20 -13
- disdrodb/metadata/manipulation.py +1 -1
- disdrodb/metadata/reader.py +59 -8
- disdrodb/metadata/search.py +77 -144
- disdrodb/metadata/standards.py +7 -8
- disdrodb/metadata/writer.py +8 -14
- disdrodb/psd/__init__.py +38 -0
- disdrodb/psd/fitting.py +2146 -0
- disdrodb/psd/models.py +774 -0
- disdrodb/routines.py +1176 -0
- disdrodb/scattering/__init__.py +28 -0
- disdrodb/scattering/axis_ratio.py +344 -0
- disdrodb/scattering/routines.py +456 -0
- disdrodb/utils/__init__.py +17 -0
- disdrodb/utils/attrs.py +208 -0
- disdrodb/utils/cli.py +269 -0
- disdrodb/utils/compression.py +60 -42
- disdrodb/utils/dask.py +62 -0
- disdrodb/utils/decorators.py +110 -0
- disdrodb/utils/directories.py +107 -46
- disdrodb/utils/encoding.py +127 -0
- disdrodb/utils/list.py +29 -0
- disdrodb/utils/logger.py +168 -46
- disdrodb/utils/time.py +657 -0
- disdrodb/utils/warnings.py +30 -0
- disdrodb/utils/writer.py +57 -0
- disdrodb/utils/xarray.py +138 -47
- disdrodb/utils/yaml.py +0 -1
- disdrodb/viz/__init__.py +17 -0
- disdrodb/viz/plots.py +17 -0
- disdrodb-0.1.0.dist-info/METADATA +321 -0
- disdrodb-0.1.0.dist-info/RECORD +216 -0
- {disdrodb-0.0.21.dist-info → disdrodb-0.1.0.dist-info}/WHEEL +1 -1
- disdrodb-0.1.0.dist-info/entry_points.txt +30 -0
- disdrodb/data_transfer/scripts/disdrodb_download_archive.py +0 -53
- disdrodb/data_transfer/scripts/disdrodb_upload_archive.py +0 -57
- disdrodb/l0/configs/OTT_Parsivel/l0a_encodings.yml +0 -32
- disdrodb/l0/configs/OTT_Parsivel2/l0a_encodings.yml +0 -39
- disdrodb/l0/configs/RD_80/l0a_encodings.yml +0 -16
- disdrodb/l0/configs/RD_80/l0b_encodings.yml +0 -135
- disdrodb/l0/configs/Thies_LPM/l0a_encodings.yml +0 -80
- disdrodb/l0/io.py +0 -257
- disdrodb/l0/l0_processing.py +0 -1091
- disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_OTT.py +0 -178
- disdrodb/l0/readers/AUSTRALIA/MELBOURNE_2007_THIES.py +0 -247
- disdrodb/l0/readers/BRAZIL/CHUVA_LPM.py +0 -204
- disdrodb/l0/readers/BRAZIL/CHUVA_OTT.py +0 -183
- disdrodb/l0/readers/BRAZIL/GOAMAZON_LPM.py +0 -204
- disdrodb/l0/readers/BRAZIL/GOAMAZON_OTT.py +0 -183
- disdrodb/l0/readers/CHINA/CHONGQING.py +0 -131
- disdrodb/l0/readers/EPFL/EPFL_ROOF_2008.py +0 -128
- disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP2.py +0 -127
- disdrodb/l0/readers/EPFL/HYMEX_LTE_SOP3.py +0 -129
- disdrodb/l0/readers/EPFL/RACLETS_2019.py +0 -158
- disdrodb/l0/readers/EPFL/SAMOYLOV_2017.py +0 -136
- disdrodb/l0/readers/EPFL/SAMOYLOV_2019.py +0 -158
- disdrodb/l0/readers/FRANCE/SIRTA_OTT2.py +0 -138
- disdrodb/l0/readers/GPM/GCPEX.py +0 -123
- disdrodb/l0/readers/GPM/IFLOODS.py +0 -123
- disdrodb/l0/readers/GPM/MC3E.py +0 -123
- disdrodb/l0/readers/GPM/NSSTC.py +0 -164
- disdrodb/l0/readers/ITALY/GID.py +0 -199
- disdrodb/l0/readers/MEXICO/OH_IIUNAM_nc.py +0 -92
- disdrodb/l0/readers/NCAR/CCOPE_2015.py +0 -133
- disdrodb/l0/readers/NCAR/PECAN_FP3.py +0 -137
- disdrodb/l0/readers/NCAR/PECAN_MOBILE.py +0 -144
- disdrodb/l0/readers/NCAR/RELAMPAGO_OTT.py +0 -195
- disdrodb/l0/readers/NCAR/SNOWIE_PJ.py +0 -172
- disdrodb/l0/readers/NCAR/SNOWIE_SB.py +0 -179
- disdrodb/l0/readers/NCAR/VORTEX2_2009.py +0 -133
- disdrodb/l0/readers/NCAR/VORTEX2_2010.py +0 -188
- disdrodb/l0/readers/NCAR/VORTEX2_2010_UF.py +0 -191
- disdrodb/l0/readers/NCAR/VORTEX_SE_2016_P2.py +0 -135
- disdrodb/l0/readers/NCAR/VORTEX_SE_2016_PIPS.py +0 -170
- disdrodb/l0/readers/NETHERLANDS/DELFT.py +0 -187
- disdrodb/l0/readers/SPAIN/SBEGUERIA.py +0 -179
- disdrodb/l0/scripts/disdrodb_run_l0b_concat.py +0 -93
- disdrodb/l0/scripts/disdrodb_run_l0b_concat_station.py +0 -85
- disdrodb/utils/netcdf.py +0 -452
- disdrodb/utils/scripts.py +0 -102
- disdrodb-0.0.21.dist-info/AUTHORS.md +0 -18
- disdrodb-0.0.21.dist-info/METADATA +0 -186
- disdrodb-0.0.21.dist-info/RECORD +0 -168
- disdrodb-0.0.21.dist-info/entry_points.txt +0 -15
- /disdrodb/l0/configs/{RD_80 → RD80}/bins_velocity.yml +0 -0
- /disdrodb/l0/manuals/{Thies_LPM.pdf → LPM.pdf} +0 -0
- /disdrodb/l0/manuals/{ODM_470.pdf → ODM470.pdf} +0 -0
- /disdrodb/l0/manuals/{OTT_Parsivel.pdf → PARSIVEL.pdf} +0 -0
- /disdrodb/l0/manuals/{OTT_Parsivel2.pdf → PARSIVEL2.pdf} +0 -0
- /disdrodb/l0/manuals/{PWS_100.pdf → PWS100.pdf} +0 -0
- /disdrodb/l0/manuals/{RD_80.pdf → RD80.pdf} +0 -0
- {disdrodb-0.0.21.dist-info → disdrodb-0.1.0.dist-info/licenses}/LICENSE +0 -0
- {disdrodb-0.0.21.dist-info → disdrodb-0.1.0.dist-info}/top_level.txt +0 -0
|
@@ -16,354 +16,296 @@
|
|
|
16
16
|
# You should have received a copy of the GNU General Public License
|
|
17
17
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
18
18
|
# -----------------------------------------------------------------------------.
|
|
19
|
-
"""Tools to create
|
|
19
|
+
"""Tools to create RAW, L0A and L0B DISDRODB directories."""
|
|
20
20
|
|
|
21
|
-
# L0A and L0B from raw NC: create_l0_directory_structure(
|
|
22
|
-
# L0B:
|
|
21
|
+
# L0A and L0B from raw NC: create_l0_directory_structure(...)
|
|
22
|
+
# L0B: create_product_directory(...)
|
|
23
23
|
|
|
24
24
|
import logging
|
|
25
25
|
import os
|
|
26
26
|
import shutil
|
|
27
27
|
|
|
28
28
|
from disdrodb.api.checks import (
|
|
29
|
+
check_campaign_name,
|
|
30
|
+
check_data_archive_dir,
|
|
31
|
+
check_data_availability,
|
|
32
|
+
check_data_source,
|
|
33
|
+
check_issue_file,
|
|
29
34
|
check_metadata_file,
|
|
30
|
-
check_processed_dir,
|
|
31
35
|
check_product,
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
has_available_station_files,
|
|
35
|
-
)
|
|
36
|
-
from disdrodb.api.info import (
|
|
37
|
-
infer_campaign_name_from_path,
|
|
38
|
-
infer_data_source_from_path,
|
|
39
|
-
infer_disdrodb_tree_path_components,
|
|
36
|
+
has_available_data,
|
|
37
|
+
select_required_product_kwargs,
|
|
40
38
|
)
|
|
41
39
|
from disdrodb.api.path import (
|
|
42
|
-
|
|
40
|
+
define_data_dir,
|
|
43
41
|
define_issue_dir,
|
|
44
|
-
|
|
42
|
+
define_logs_dir,
|
|
45
43
|
define_metadata_dir,
|
|
46
44
|
define_metadata_filepath,
|
|
47
|
-
define_station_dir,
|
|
48
45
|
)
|
|
49
|
-
from disdrodb.configs import
|
|
46
|
+
from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
|
|
50
47
|
from disdrodb.utils.directories import (
|
|
51
|
-
|
|
52
|
-
copy_file,
|
|
53
|
-
create_required_directory,
|
|
48
|
+
create_directory,
|
|
54
49
|
remove_if_exists,
|
|
55
50
|
)
|
|
56
51
|
|
|
57
52
|
logger = logging.getLogger(__name__)
|
|
58
53
|
|
|
54
|
+
####--------------------------------------------------------------------------------.
|
|
55
|
+
#### DISDRODB Products Directories
|
|
59
56
|
|
|
60
|
-
#### DISDRODB Products directories
|
|
61
|
-
def _check_data_source_consistency(raw_dir: str, processed_dir: str) -> str:
|
|
62
|
-
"""Check that 'raw_dir' and 'processed_dir' have same data_source.
|
|
63
|
-
|
|
64
|
-
Parameters
|
|
65
|
-
----------
|
|
66
|
-
raw_dir : str
|
|
67
|
-
Path of the raw campaign directory
|
|
68
|
-
processed_dir : str
|
|
69
|
-
Path of the processed campaign directory
|
|
70
|
-
|
|
71
|
-
Returns
|
|
72
|
-
-------
|
|
73
|
-
str
|
|
74
|
-
data_source in capital letter.
|
|
75
57
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
msg = f"
|
|
58
|
+
def ensure_empty_data_dir(data_dir, force):
|
|
59
|
+
"""Remove the content of the data_dir directory."""
|
|
60
|
+
# If force=True, remove all the directory content
|
|
61
|
+
if force:
|
|
62
|
+
shutil.rmtree(data_dir)
|
|
63
|
+
# Recreate the directory
|
|
64
|
+
create_directory(data_dir)
|
|
65
|
+
else:
|
|
66
|
+
msg = f"The product directory {data_dir} already contains files and force=False."
|
|
85
67
|
logger.error(msg)
|
|
86
68
|
raise ValueError(msg)
|
|
87
|
-
return raw_data_source.upper()
|
|
88
69
|
|
|
89
70
|
|
|
90
|
-
def
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
71
|
+
def create_l0_directory_structure(
|
|
72
|
+
data_archive_dir,
|
|
73
|
+
metadata_archive_dir,
|
|
74
|
+
data_source,
|
|
75
|
+
campaign_name,
|
|
76
|
+
station_name,
|
|
77
|
+
force,
|
|
78
|
+
product,
|
|
79
|
+
):
|
|
80
|
+
"""Create directory structure for the first L0 DISDRODB product.
|
|
99
81
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
str
|
|
103
|
-
Campaign name in capital letter.
|
|
82
|
+
If the input data are raw text files, use ``product = "L0A"``
|
|
83
|
+
If the input data are raw netCDF files, use ``product = "L0B"``
|
|
104
84
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
ValueError
|
|
108
|
-
Error if the campaign_name of the two directory paths does not match.
|
|
85
|
+
``product = "L0A"`` will call ``run_l0a``.
|
|
86
|
+
``product = "L0B"`` will call ``run_l0b_nc``.
|
|
109
87
|
"""
|
|
110
|
-
|
|
111
|
-
processed_campaign_name = infer_campaign_name_from_path(processed_dir)
|
|
112
|
-
if raw_campaign_name != processed_campaign_name:
|
|
113
|
-
msg = f"'raw_dir' and 'processed_dir' must ends with same <CAMPAIGN_NAME>: {raw_campaign_name}"
|
|
114
|
-
logger.error(msg)
|
|
115
|
-
raise ValueError(msg)
|
|
116
|
-
return raw_campaign_name.upper()
|
|
117
|
-
|
|
88
|
+
from disdrodb.configs import get_data_archive_dir, get_metadata_archive_dir
|
|
118
89
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
"""Copy the station YAML file from the raw_dir/metadata into processed_dir/metadata
|
|
90
|
+
# Retrieve the DISDRODB Metadata Archive directory
|
|
91
|
+
data_archive_dir = get_data_archive_dir(data_archive_dir)
|
|
92
|
+
metadata_archive_dir = get_metadata_archive_dir(metadata_archive_dir)
|
|
123
93
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
Path of the raw campaign directory
|
|
128
|
-
processed_dir : str
|
|
129
|
-
Path of the processed campaign directory
|
|
94
|
+
# Check <DATA_SOURCE> and <CAMPAIGN_NAME> are upper case
|
|
95
|
+
check_campaign_name(campaign_name)
|
|
96
|
+
check_data_source(data_source)
|
|
130
97
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
ValueError
|
|
134
|
-
Error if the copy fails.
|
|
135
|
-
"""
|
|
136
|
-
# Check the raw metadata YAML file exists
|
|
137
|
-
raw_metadata_filepath = check_metadata_file(
|
|
98
|
+
# Check raw station data are available
|
|
99
|
+
check_data_availability(
|
|
138
100
|
product="RAW",
|
|
139
|
-
|
|
101
|
+
data_archive_dir=data_archive_dir,
|
|
140
102
|
data_source=data_source,
|
|
141
103
|
campaign_name=campaign_name,
|
|
142
104
|
station_name=station_name,
|
|
143
|
-
check_validity=check_validity,
|
|
144
105
|
)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
106
|
+
|
|
107
|
+
# Check there is a valid metadata YAML file
|
|
108
|
+
check_metadata_file(
|
|
109
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
149
110
|
data_source=data_source,
|
|
150
111
|
campaign_name=campaign_name,
|
|
151
112
|
station_name=station_name,
|
|
152
113
|
)
|
|
153
|
-
# Copy the metadata file
|
|
154
|
-
copy_file(
|
|
155
|
-
src_filepath=raw_metadata_filepath,
|
|
156
|
-
dst_filepath=processed_metadata_filepath,
|
|
157
|
-
)
|
|
158
|
-
return None
|
|
159
114
|
|
|
115
|
+
# Check there is valid issue YAML file
|
|
116
|
+
check_issue_file(
|
|
117
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
118
|
+
data_source=data_source,
|
|
119
|
+
campaign_name=campaign_name,
|
|
120
|
+
station_name=station_name,
|
|
121
|
+
)
|
|
160
122
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
):
|
|
164
|
-
"""Check for pre-existing station data.
|
|
165
|
-
|
|
166
|
-
- If force=True, remove all data inside the station directory.
|
|
167
|
-
- If force=False, raise error.
|
|
168
|
-
|
|
169
|
-
NOTE: force=False behaviour could be changed to enable updating of missing files.
|
|
170
|
-
This would require also adding code to check whether a downstream file already exist.
|
|
171
|
-
"""
|
|
172
|
-
# Check if there are available data
|
|
173
|
-
available_data = has_available_station_files(
|
|
123
|
+
# Define product output data directory
|
|
124
|
+
data_dir = define_data_dir(
|
|
174
125
|
product=product,
|
|
175
|
-
|
|
126
|
+
data_archive_dir=data_archive_dir,
|
|
176
127
|
data_source=data_source,
|
|
177
128
|
campaign_name=campaign_name,
|
|
178
129
|
station_name=station_name,
|
|
179
130
|
)
|
|
180
|
-
|
|
181
|
-
|
|
131
|
+
|
|
132
|
+
# Create product output data directory (if it doesn't exist)
|
|
133
|
+
create_directory(data_dir)
|
|
134
|
+
|
|
135
|
+
# Check if product files are already available
|
|
136
|
+
available_data = has_available_data(
|
|
182
137
|
product=product,
|
|
183
|
-
|
|
138
|
+
data_archive_dir=data_archive_dir,
|
|
184
139
|
data_source=data_source,
|
|
185
140
|
campaign_name=campaign_name,
|
|
186
141
|
station_name=station_name,
|
|
187
142
|
)
|
|
188
|
-
|
|
189
|
-
#
|
|
190
|
-
# - If force=
|
|
143
|
+
|
|
144
|
+
# If product files are already available:
|
|
145
|
+
# - If force=True, remove all data inside the product directory
|
|
146
|
+
# - If force=False, raise an error
|
|
191
147
|
if available_data:
|
|
192
|
-
|
|
193
|
-
check_directory_exists(station_dir)
|
|
194
|
-
# If force=True, remove all the content
|
|
195
|
-
if force:
|
|
196
|
-
# Remove all station directory content
|
|
197
|
-
shutil.rmtree(station_dir)
|
|
198
|
-
else:
|
|
199
|
-
msg = f"The station directory {station_dir} already exists and force=False."
|
|
200
|
-
logger.error(msg)
|
|
201
|
-
raise ValueError(msg)
|
|
148
|
+
ensure_empty_data_dir(data_dir, force=force)
|
|
202
149
|
|
|
150
|
+
return data_dir
|
|
203
151
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
152
|
+
|
|
153
|
+
def create_product_directory(
|
|
154
|
+
data_source,
|
|
155
|
+
campaign_name,
|
|
207
156
|
station_name,
|
|
208
|
-
force,
|
|
209
157
|
product,
|
|
210
|
-
|
|
158
|
+
force,
|
|
159
|
+
data_archive_dir=None,
|
|
160
|
+
metadata_archive_dir=None,
|
|
161
|
+
# Product Options
|
|
162
|
+
**product_kwargs,
|
|
211
163
|
):
|
|
212
|
-
"""
|
|
164
|
+
"""Initialize the directory structure for a DISDRODB product.
|
|
213
165
|
|
|
214
|
-
If
|
|
215
|
-
If
|
|
166
|
+
If product files already exists:
|
|
167
|
+
- If ``force=True``, it remove all existing data inside the product directory.
|
|
168
|
+
- If ``force=False``, it raise an error.
|
|
216
169
|
"""
|
|
217
|
-
#
|
|
218
|
-
|
|
219
|
-
processed_dir = check_processed_dir(processed_dir=processed_dir)
|
|
220
|
-
|
|
221
|
-
# Check consistent data_source and campaign name
|
|
222
|
-
_ = _check_data_source_consistency(raw_dir=raw_dir, processed_dir=processed_dir)
|
|
223
|
-
_ = _check_campaign_name_consistency(raw_dir=raw_dir, processed_dir=processed_dir)
|
|
224
|
-
|
|
225
|
-
# Retrieve components
|
|
226
|
-
base_dir, product_type, data_source, campaign_name = infer_disdrodb_tree_path_components(processed_dir)
|
|
227
|
-
|
|
228
|
-
# Check station data are available
|
|
229
|
-
check_station_has_data(
|
|
230
|
-
product="RAW",
|
|
231
|
-
base_dir=base_dir,
|
|
232
|
-
data_source=data_source,
|
|
233
|
-
campaign_name=campaign_name,
|
|
234
|
-
station_name=station_name,
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
# Create required directories (if they don't exist)
|
|
238
|
-
create_required_directory(processed_dir, dir_name="metadata")
|
|
239
|
-
create_required_directory(processed_dir, dir_name="info")
|
|
240
|
-
create_required_directory(processed_dir, dir_name=product)
|
|
170
|
+
# NOTE: ``force=False`` behaviour could be changed to enable updating of missing files.
|
|
171
|
+
# This would require also adding code to check whether a downstream file already exist.
|
|
241
172
|
|
|
242
|
-
|
|
243
|
-
_copy_station_metadata(
|
|
244
|
-
base_dir=base_dir,
|
|
245
|
-
data_source=data_source,
|
|
246
|
-
campaign_name=campaign_name,
|
|
247
|
-
station_name=station_name,
|
|
248
|
-
)
|
|
249
|
-
# Remove <product>/<station> directory if force=True
|
|
250
|
-
_check_pre_existing_station_data(
|
|
251
|
-
product=product,
|
|
252
|
-
base_dir=base_dir,
|
|
253
|
-
data_source=data_source,
|
|
254
|
-
campaign_name=campaign_name,
|
|
255
|
-
station_name=station_name,
|
|
256
|
-
force=force,
|
|
257
|
-
)
|
|
258
|
-
# Create the <product>/<station> directory
|
|
259
|
-
create_required_directory(os.path.join(processed_dir, product), dir_name=station_name)
|
|
173
|
+
from disdrodb.api.search import get_required_product
|
|
260
174
|
|
|
175
|
+
# Get DISDRODB base directory
|
|
176
|
+
data_archive_dir = get_data_archive_dir(data_archive_dir)
|
|
177
|
+
metadata_archive_dir = get_metadata_archive_dir(metadata_archive_dir)
|
|
261
178
|
|
|
262
|
-
def create_directory_structure(processed_dir, product, station_name, force):
|
|
263
|
-
"""Create directory structure for L0B and higher DISDRODB products."""
|
|
264
179
|
# Check inputs
|
|
265
180
|
check_product(product)
|
|
266
|
-
processed_dir = check_processed_dir(processed_dir=processed_dir)
|
|
267
|
-
|
|
268
|
-
base_dir, product_type, data_source, campaign_name = infer_disdrodb_tree_path_components(processed_dir)
|
|
269
181
|
|
|
270
182
|
# Determine required product
|
|
271
|
-
|
|
272
|
-
required_product = "L0A"
|
|
273
|
-
else:
|
|
274
|
-
raise NotImplementedError("product {product} not yet implemented.")
|
|
183
|
+
required_product = get_required_product(product)
|
|
275
184
|
|
|
276
|
-
# Check station is available in the previous product level
|
|
277
|
-
|
|
185
|
+
# Check station data is available in the previous product level
|
|
186
|
+
required_product_kwargs = select_required_product_kwargs(required_product, product_kwargs)
|
|
187
|
+
check_data_availability(
|
|
278
188
|
product=required_product,
|
|
279
|
-
|
|
189
|
+
data_archive_dir=data_archive_dir,
|
|
280
190
|
data_source=data_source,
|
|
281
191
|
campaign_name=campaign_name,
|
|
282
192
|
station_name=station_name,
|
|
193
|
+
# Product options
|
|
194
|
+
**required_product_kwargs,
|
|
283
195
|
)
|
|
284
196
|
|
|
285
197
|
# Check metadata file is available
|
|
286
198
|
check_metadata_file(
|
|
287
|
-
|
|
288
|
-
|
|
199
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
200
|
+
data_source=data_source,
|
|
201
|
+
campaign_name=campaign_name,
|
|
202
|
+
station_name=station_name,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
# Define product output data directory
|
|
206
|
+
data_dir = define_data_dir(
|
|
207
|
+
product=product,
|
|
208
|
+
data_archive_dir=data_archive_dir,
|
|
289
209
|
data_source=data_source,
|
|
290
210
|
campaign_name=campaign_name,
|
|
291
211
|
station_name=station_name,
|
|
212
|
+
# Product options
|
|
213
|
+
**product_kwargs,
|
|
292
214
|
)
|
|
293
215
|
|
|
294
|
-
# Create
|
|
295
|
-
|
|
216
|
+
# Create product output data directory (if it doesn't exist)
|
|
217
|
+
create_directory(data_dir)
|
|
296
218
|
|
|
297
|
-
#
|
|
298
|
-
|
|
219
|
+
# Check if product files are already available
|
|
220
|
+
available_data = has_available_data(
|
|
299
221
|
product=product,
|
|
300
|
-
|
|
222
|
+
data_archive_dir=data_archive_dir,
|
|
301
223
|
data_source=data_source,
|
|
302
224
|
campaign_name=campaign_name,
|
|
303
225
|
station_name=station_name,
|
|
304
|
-
|
|
226
|
+
# Product options
|
|
227
|
+
**product_kwargs,
|
|
305
228
|
)
|
|
306
229
|
|
|
230
|
+
# If product files are already available:
|
|
231
|
+
# - If force=True, remove all data inside the product directory
|
|
232
|
+
# - If force=False, raise an error
|
|
233
|
+
if available_data:
|
|
234
|
+
ensure_empty_data_dir(data_dir, force=force)
|
|
307
235
|
|
|
308
|
-
|
|
236
|
+
# Return product directory
|
|
237
|
+
return data_dir
|
|
309
238
|
|
|
310
239
|
|
|
311
|
-
def
|
|
240
|
+
def create_logs_directory(
|
|
241
|
+
product,
|
|
312
242
|
data_source,
|
|
313
243
|
campaign_name,
|
|
314
244
|
station_name,
|
|
315
|
-
|
|
316
|
-
|
|
245
|
+
data_archive_dir=None,
|
|
246
|
+
# Product options
|
|
247
|
+
**product_kwargs,
|
|
317
248
|
):
|
|
318
|
-
"""
|
|
319
|
-
#
|
|
320
|
-
|
|
321
|
-
base_dir=base_dir,
|
|
249
|
+
"""Initialize the logs directory structure for a DISDRODB product."""
|
|
250
|
+
# Define logs directory
|
|
251
|
+
logs_dir = define_logs_dir(
|
|
322
252
|
product=product,
|
|
253
|
+
data_archive_dir=data_archive_dir,
|
|
323
254
|
data_source=data_source,
|
|
324
255
|
campaign_name=campaign_name,
|
|
325
256
|
station_name=station_name,
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
base_dir=base_dir, product=product, data_source=data_source, campaign_name=campaign_name
|
|
257
|
+
# Product options
|
|
258
|
+
**product_kwargs,
|
|
329
259
|
)
|
|
330
260
|
|
|
331
|
-
|
|
332
|
-
|
|
261
|
+
# Ensure empty log directory
|
|
262
|
+
if os.path.isdir(logs_dir):
|
|
263
|
+
shutil.rmtree(logs_dir)
|
|
333
264
|
|
|
265
|
+
# Create logs directory
|
|
266
|
+
os.makedirs(logs_dir, exist_ok=True)
|
|
334
267
|
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
268
|
+
# Return logs directory
|
|
269
|
+
return logs_dir
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
####--------------------------------------------------------------------------------.
|
|
273
|
+
#### DISDRODB Station Initialization
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def create_data_directory(data_archive_dir, product, data_source, campaign_name, station_name, **product_kwargs):
|
|
277
|
+
"""Create station product data directory."""
|
|
278
|
+
data_dir = define_data_dir(
|
|
279
|
+
data_archive_dir=data_archive_dir,
|
|
339
280
|
product=product,
|
|
340
281
|
data_source=data_source,
|
|
341
282
|
campaign_name=campaign_name,
|
|
283
|
+
station_name=station_name,
|
|
342
284
|
check_exists=False,
|
|
285
|
+
**product_kwargs,
|
|
343
286
|
)
|
|
344
|
-
if not os.path.exists(
|
|
345
|
-
os.makedirs(
|
|
346
|
-
return str(
|
|
287
|
+
if not os.path.exists(data_dir):
|
|
288
|
+
os.makedirs(data_dir, exist_ok=True)
|
|
289
|
+
return str(data_dir)
|
|
347
290
|
|
|
348
291
|
|
|
349
|
-
def
|
|
350
|
-
"""Create
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
product=product,
|
|
292
|
+
def create_metadata_directory(metadata_archive_dir, data_source, campaign_name):
|
|
293
|
+
"""Create metadata directory."""
|
|
294
|
+
metadata_dir = define_metadata_dir(
|
|
295
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
354
296
|
data_source=data_source,
|
|
355
297
|
campaign_name=campaign_name,
|
|
356
|
-
station_name=station_name,
|
|
357
298
|
check_exists=False,
|
|
358
299
|
)
|
|
359
|
-
if not os.path.exists(
|
|
360
|
-
os.makedirs(
|
|
361
|
-
return str(
|
|
300
|
+
if not os.path.exists(metadata_dir):
|
|
301
|
+
os.makedirs(metadata_dir, exist_ok=True)
|
|
302
|
+
return str(metadata_dir)
|
|
362
303
|
|
|
363
304
|
|
|
364
|
-
def create_issue_directory(
|
|
305
|
+
def create_issue_directory(metadata_archive_dir, data_source, campaign_name):
|
|
306
|
+
"""Create issue directory."""
|
|
365
307
|
issue_dir = define_issue_dir(
|
|
366
|
-
|
|
308
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
367
309
|
data_source=data_source,
|
|
368
310
|
campaign_name=campaign_name,
|
|
369
311
|
check_exists=False,
|
|
@@ -377,107 +319,110 @@ def create_initial_station_structure(
|
|
|
377
319
|
data_source,
|
|
378
320
|
campaign_name,
|
|
379
321
|
station_name,
|
|
380
|
-
|
|
322
|
+
data_archive_dir=None,
|
|
323
|
+
metadata_archive_dir=None,
|
|
381
324
|
):
|
|
382
|
-
"""Create the DISDRODB Data Archive structure for a single station."""
|
|
325
|
+
"""Create the DISDRODB Data and Metadata Archive structure for a single station."""
|
|
383
326
|
from disdrodb.issue.writer import create_station_issue
|
|
384
327
|
from disdrodb.metadata.writer import create_station_metadata
|
|
385
328
|
|
|
329
|
+
data_archive_dir = get_data_archive_dir(data_archive_dir)
|
|
330
|
+
metadata_archive_dir = get_metadata_archive_dir(metadata_archive_dir)
|
|
331
|
+
|
|
386
332
|
# Check if already been defined
|
|
387
333
|
# - Check presence of metadata file
|
|
388
334
|
metadata_filepath = define_metadata_filepath(
|
|
389
|
-
|
|
335
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
390
336
|
data_source=data_source,
|
|
391
337
|
campaign_name=campaign_name,
|
|
392
338
|
station_name=station_name,
|
|
393
|
-
product="RAW",
|
|
394
|
-
check_exists=False,
|
|
395
339
|
)
|
|
396
340
|
if os.path.exists(metadata_filepath):
|
|
397
341
|
raise ValueError(
|
|
398
|
-
f"
|
|
399
|
-
"
|
|
400
|
-
"
|
|
342
|
+
f"The DISDRODB Metadata Archive has already a metadata file "
|
|
343
|
+
f"for {data_source} {campaign_name} {station_name} at '{metadata_filepath}'. "
|
|
344
|
+
"You might have already initialized the directory structure for such station !",
|
|
401
345
|
)
|
|
402
346
|
|
|
403
|
-
#
|
|
404
|
-
|
|
405
|
-
|
|
347
|
+
# -----------------------.
|
|
348
|
+
# Create station directory in the DISDRODB Data Archive
|
|
349
|
+
data_dir = create_data_directory(
|
|
350
|
+
data_archive_dir=data_archive_dir,
|
|
351
|
+
product="RAW",
|
|
406
352
|
data_source=data_source,
|
|
407
353
|
campaign_name=campaign_name,
|
|
408
354
|
station_name=station_name,
|
|
409
|
-
product="RAW",
|
|
410
355
|
)
|
|
411
356
|
|
|
412
|
-
#
|
|
357
|
+
# -----------------------.
|
|
358
|
+
# Create issue and metadata files in the DISDRODB Metadata Archive
|
|
359
|
+
# - Create /metadata and /issue directories in the DISDRODB Metadata Archive
|
|
360
|
+
_ = create_metadata_directory(
|
|
361
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
362
|
+
data_source=data_source,
|
|
363
|
+
campaign_name=campaign_name,
|
|
364
|
+
)
|
|
365
|
+
_ = create_issue_directory(
|
|
366
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
367
|
+
data_source=data_source,
|
|
368
|
+
campaign_name=campaign_name,
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
# - Add an empty/default metadata file (to be filled by data contributor)
|
|
413
372
|
create_station_metadata(
|
|
414
|
-
|
|
373
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
415
374
|
data_source=data_source,
|
|
416
375
|
campaign_name=campaign_name,
|
|
417
376
|
station_name=station_name,
|
|
418
377
|
)
|
|
419
|
-
# Add
|
|
378
|
+
# - Add an empty issue file (to be filled by data contributor if necessary)
|
|
420
379
|
create_station_issue(
|
|
421
|
-
|
|
380
|
+
metadata_archive_dir=metadata_archive_dir,
|
|
422
381
|
data_source=data_source,
|
|
423
382
|
campaign_name=campaign_name,
|
|
424
383
|
station_name=station_name,
|
|
425
384
|
)
|
|
426
385
|
|
|
427
|
-
#
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
)
|
|
431
|
-
print(f"
|
|
386
|
+
# --------------------------------------------------------------------------.
|
|
387
|
+
# Report next steps to contribute data to DISDRODB
|
|
388
|
+
print("The DISDRODB Metadata and Data Archive directories have been initialized.")
|
|
389
|
+
print("To contribute your data to DISDRODB:")
|
|
390
|
+
print(f"1. Place you raw data within the '{data_dir}' directory.")
|
|
391
|
+
print(f"2. Fill the metadata fields of the '{metadata_filepath}' file.")
|
|
432
392
|
|
|
433
393
|
|
|
394
|
+
####--------------------------------------------------------------------------------.
|
|
434
395
|
#### DISDRODB upload/download testing
|
|
435
|
-
def create_test_archive(
|
|
396
|
+
def create_test_archive(
|
|
397
|
+
test_data_archive_dir,
|
|
398
|
+
data_source,
|
|
399
|
+
campaign_name,
|
|
400
|
+
station_name,
|
|
401
|
+
data_archive_dir=None,
|
|
402
|
+
metadata_archive_dir=None,
|
|
403
|
+
force=False,
|
|
404
|
+
):
|
|
436
405
|
"""Create test DISDRODB Archive for a single existing station.
|
|
437
406
|
|
|
438
407
|
This function is used to make a copy of metadata and issue files of a stations.
|
|
439
408
|
This enable to then test data download and DISDRODB processing.
|
|
440
409
|
"""
|
|
441
|
-
# Check
|
|
442
|
-
|
|
443
|
-
|
|
410
|
+
# Check metadata repository is available
|
|
411
|
+
metadata_archive_dir = get_metadata_archive_dir(metadata_archive_dir)
|
|
412
|
+
|
|
413
|
+
# Check test_data_archive_dir is not equal to true data_archive_dir
|
|
414
|
+
test_data_archive_dir = check_data_archive_dir(test_data_archive_dir)
|
|
415
|
+
if test_data_archive_dir == get_data_archive_dir(data_archive_dir):
|
|
416
|
+
raise ValueError(
|
|
417
|
+
"Provide a test_data_archive_dir directory different from the true DISDRODB Data Archive directory !",
|
|
418
|
+
)
|
|
444
419
|
|
|
445
420
|
# Create test DISDRODB base directory
|
|
446
|
-
remove_if_exists(
|
|
447
|
-
os.makedirs(
|
|
421
|
+
remove_if_exists(test_data_archive_dir, force=force)
|
|
422
|
+
os.makedirs(test_data_archive_dir, exist_ok=True)
|
|
448
423
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
product="RAW",
|
|
453
|
-
data_source=data_source,
|
|
454
|
-
campaign_name=campaign_name,
|
|
455
|
-
station_name=station_name,
|
|
456
|
-
)
|
|
457
|
-
# Copy metadata and issue files in the test archive
|
|
458
|
-
src_metadata_fpath = define_metadata_filepath(
|
|
459
|
-
product="RAW",
|
|
460
|
-
data_source=data_source,
|
|
461
|
-
campaign_name=campaign_name,
|
|
462
|
-
station_name=station_name,
|
|
463
|
-
base_dir=base_dir,
|
|
464
|
-
)
|
|
465
|
-
dst_metadata_fpath = define_metadata_filepath(
|
|
466
|
-
product="RAW",
|
|
467
|
-
data_source=data_source,
|
|
468
|
-
campaign_name=campaign_name,
|
|
469
|
-
station_name=station_name,
|
|
470
|
-
base_dir=test_base_dir,
|
|
471
|
-
)
|
|
472
|
-
src_issue_fpath = define_issue_filepath(
|
|
473
|
-
data_source=data_source,
|
|
474
|
-
campaign_name=campaign_name,
|
|
475
|
-
station_name=station_name,
|
|
476
|
-
base_dir=base_dir,
|
|
477
|
-
)
|
|
478
|
-
dst_issue_fpath = define_issue_filepath(
|
|
479
|
-
data_source=data_source, campaign_name=campaign_name, station_name=station_name, base_dir=test_base_dir
|
|
424
|
+
tree = f"{data_source} {campaign_name} {station_name}"
|
|
425
|
+
print(
|
|
426
|
+
f"The test DISDRODB Data Archive for {tree} has been set up at {test_data_archive_dir} !",
|
|
480
427
|
)
|
|
481
|
-
|
|
482
|
-
copy_file(src_metadata_fpath, dst_metadata_fpath)
|
|
483
|
-
print(f"The test DISDRODB archive for {data_source} {campaign_name} {station_name} has been set up !")
|
|
428
|
+
return test_data_archive_dir
|