Source code for disdrodb.metadata.writer

#!/usr/bin/env python3

# -----------------------------------------------------------------------------.
# Copyright (c) 2021-2023 DISDRODB developers
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
# -----------------------------------------------------------------------------.
"""Routines to write the DISDRODB Metadata."""

import os

from disdrodb.api.path import define_metadata_filepath
from disdrodb.metadata.manipulation import sort_metadata_dictionary
from disdrodb.metadata.standards import get_valid_metadata_keys
from disdrodb.utils.yaml import write_yaml


[docs]def get_default_metadata_dict() -> dict: """Get DISDRODB metadata default values. Returns ------- dict Dictionary of attributes standard """ # Get valid metadata keys list_attrs = get_valid_metadata_keys() attrs = {key: "" for key in list_attrs} # Add default values for certain keys attrs["latitude"] = -9999 attrs["longitude"] = -9999 attrs["altitude"] = -9999 attrs["raw_data_format"] = "txt" # ['txt', 'netcdf'] attrs["platform_type"] = "fixed" # ['fixed', 'mobile'] return attrs
[docs]def create_station_metadata(data_source, campaign_name, station_name, base_dir=None, product="RAW"): """Write a default (semi-empty) YAML metadata file for a DISDRODB station. An error is raised if the file already exists ! Parameters ---------- data_source : str The name of the institution (for campaigns spanning multiple countries) or the name of the country (for campaigns or sensor networks within a single country). Must be provided in UPPER CASE. campaign_name : str The name of the campaign. Must be provided in UPPER CASE. station_name : str The name of the station. base_dir : str, optional The base directory of DISDRODB, expected in the format ``<...>/DISDRODB``. If not specified, the path specified in the DISDRODB active configuration will be used. product : str, optional The DISDRODB product in which to search for the metadata file. The default is ``"RAW"``. """ # Define metadata filepath metadata_filepath = define_metadata_filepath( data_source=data_source, campaign_name=campaign_name, station_name=station_name, base_dir=base_dir, product=product, check_exists=False, ) if os.path.exists(metadata_filepath): raise ValueError("A metadata YAML file already exists at {metadata_filepath}.") # Create metadata dir if not existing metadata_dir = os.path.dirname(metadata_filepath) os.makedirs(metadata_dir, exist_ok=True) # Get default metadata dict metadata = get_default_metadata_dict() # Try infer the data_source, campaign_name and station_name from filepath metadata["data_source"] = data_source metadata["campaign_name"] = campaign_name metadata["station_name"] = station_name # Write the metadata metadata = sort_metadata_dictionary(metadata) write_yaml(metadata, filepath=metadata_filepath, sort_keys=False) print(f"An empty default metadata YAML file for station {station_name} has been created .")