# -*- coding: utf-8 -*-
import numpy as np
from collections import OrderedDict
[docs]class C3S_SM_TS_Attrs(object):
'''Default, common metadata for daily and monthly, dekadal products'''
def __init__(self, sensor_type, version):
'''
Parameters
----------
sensor_type : str
Sensor type: active, passive, combined
version : str
Version name to read attributes for
sub_version : str
Sub version to read attributes for
'''
self.version = version
self.product_datatype_str = {
'active': 'SSMS',
'passive': 'SSMV',
'combined': 'SSMV'
}
self.sensor_type = sensor_type
self.atts_sensor_type(sensor_type)
[docs] def atts_sensor_type(self, sensor_type='active'):
if sensor_type == "active":
self.sm_units = "percentage (%)"
self.sm_uncertainty_units = "percentage (%)"
self.sm_full_name = 'Percent of Saturation Soil Moisture Uncertainty'
self.sm_uncertainty_full_name = 'Percent of Saturation Soil Moisture Uncertainty'
else:
self.sm_units = "m3 m-3"
self.sm_uncertainty_units = "m3 m-3"
self.sm_full_name = 'Volumetric Soil Moisture'
self.sm_uncertainty_full_name = 'Volumetric Soil Moisture Uncertainty'
[docs] def dn_flag(self):
dn_flag_dict = OrderedDict([
(1, "day"),
(2, 'night'),
])
self.dn_flag_values = np.array(list(dn_flag_dict.keys()))
self.dn_flag_meanings = np.array(list(dn_flag_dict.values()))
return self.dn_flag_values, self.dn_flag_meanings
[docs] def flag(self):
flag_dict = OrderedDict([
(1, 'snow_coverage_or_temperature_below_zero'),
(2, 'dense_vegetation'),
(3,
'others_no_convergence_in_the_model_thus_no_valid_sm_estimates'),
(4, 'soil_moisture_value_exceeds_physical_boundary'),
(5, 'weight_of_measurement_below_threshold'),
(6, 'all_datasets_deemed_unreliable'),
(7, 'barren_ground_advisory_flag'),
(8, 'not_used'),
])
self.flag_values = np.array(list(flag_dict.keys()))
self.flag_meanings = np.array(list(flag_dict.values()))
return self.flag_values, self.flag_meanings
[docs] def freqbandID_flag(self):
freqbandID_flag_dict = OrderedDict([
(1, 'L14'),
(2, 'C53'),
(3, 'C66'),
(4, 'C68'),
(5, 'C69'),
(6, 'C73'),
(7, 'X107'),
(8, 'K194'),
(9, 'MODEL'),
])
self.freqbandID_flag_values = np.array(
list(freqbandID_flag_dict.keys()))
self.freqbandID_flag_meanings = np.array(
list(freqbandID_flag_dict.values()))
return self.freqbandID_flag_values, self.freqbandID_flag_meanings
[docs] def sensor_flag(self):
sensor_flag_dict = OrderedDict([
(1, 'SMMR'),
(2, 'SSMI'),
(3, 'TMI'),
(4, 'AMSRE'),
(5, 'WindSat'),
(6, 'AMSR2'),
(7, 'SMOS'),
(8, 'AMIWS'),
(9, 'ASCATA'),
(10, 'ASCATB'),
(11, 'SMAP'),
(12, 'MODEL'),
(13, 'GPM'),
(14, 'FY3B'),
(15, 'FY3D'),
(16, 'ASCATC'),
(17, 'FY3C'),
])
self.sensor_flag_values = np.array(list(sensor_flag_dict.keys()))
self.sensor_flag_meanings = np.array(list(sensor_flag_dict.values()))
return self.sensor_flag_values, self.sensor_flag_meanings
[docs] def mode_flag(self):
mode_flag_dict = OrderedDict([
(1, 'ascending'),
(2, 'descending'),
])
self.mode_flag_values = np.array(list(mode_flag_dict.keys()))
self.mode_flag_meanings = np.array(list(mode_flag_dict.values()))
return self.mode_flag_meanings, self.mode_flag_values
[docs]class C3S_daily_tsatt_nc(C3S_SM_TS_Attrs):
def __init__(self, cdr_type: str, sensor_type: str, version: str, cls):
self.general_attrs = cls(sensor_type=sensor_type, version=version)
self.version = self.general_attrs.version
sensor_type = self.general_attrs.sensor_type
self.freq = 'daily'
self.cdr_type = cdr_type
self.general_attrs.atts_sensor_type(sensor_type)
self.general_attrs.dn_flag()
self.general_attrs.flag()
self.general_attrs.freqbandID_flag()
self.general_attrs.mode_flag()
self.general_attrs.sensor_flag()
self.ts_attributes = {
'dnflag': {
'full_name': 'Day / Night Flag',
'flag_values': self.general_attrs.dn_flag_values,
'flag_meanings': self.general_attrs.dn_flag_meanings
},
'flag': {
'full_name': 'Flag',
'flag_values': self.general_attrs.flag_values,
'flag_meanings': self.general_attrs.flag_meanings
},
'freqbandID': {
'full_name': 'Frequency Band Identification',
'flag_values': self.general_attrs.freqbandID_flag_values,
'flag_meanings': self.general_attrs.freqbandID_flag_meanings
},
'mode': {
'full_name': 'Satellite Mode',
'flag_values': self.general_attrs.mode_flag_values,
'flag_meanings': self.general_attrs.mode_flag_meanings
},
'sensor': {
'full_name': 'Sensor',
'flag_values': self.general_attrs.sensor_flag_values,
'flag_meanings': self.general_attrs.sensor_flag_meanings
},
'sm': {
'full_name': self.general_attrs.sm_full_name,
'units': self.general_attrs.sm_units
},
'sm_uncertainty': {
'full_name': self.general_attrs.sm_uncertainty_full_name,
'units': self.general_attrs.sm_uncertainty_units
},
't0': {
'full_name': 'Observation Timestamp',
'units': 'days since 1970-01-01 00:00:00 UTC'
}
}
_prod = sensor_type.upper()
_freq = self.freq.upper()
_cdr = self.cdr_type.upper()
_vers = self.version
product_name = " ".join([
'C3S', 'SOILMOISTURE', 'L3S',
self.general_attrs.product_datatype_str[sensor_type].upper(),
_prod, _freq, _cdr, _vers
])
self.global_attr = {
'product_full_name': product_name,
'product': str(_prod),
'temporal_sampling': str(_freq),
'cdr': str(_cdr),
'version': str(_vers),
'resolution': '0.25 degree'
}
[docs]class C3S_dekmon_tsatt_nc(object):
"""
Attributes for c3s dekadal and monthly for active, passive and combined
tcdr and icdr timeseries files.
"""
def __init__(self, freq: str, cdr_type: str, sensor_type: str, version: str,
cls):
self.general_attrs = cls(sensor_type=sensor_type, version=version)
self.version = self.general_attrs.version
sensor_type = self.general_attrs.sensor_type
self.freq = freq
self.cdr_type = cdr_type
self.general_attrs.atts_sensor_type(sensor_type)
self.general_attrs.dn_flag()
self.general_attrs.freqbandID_flag()
self.general_attrs.sensor_flag()
self.ts_attributes = {
'freqbandID': {
'full_name': 'Frequency Band Identification',
'flag_values': self.general_attrs.freqbandID_flag_values,
'flag_meanings': self.general_attrs.freqbandID_flag_meanings
},
'sensor': {
'full_name': 'Sensor',
'flag_values': self.general_attrs.sensor_flag_values,
'flag_meanings': self.general_attrs.sensor_flag_meanings
},
'nobs': {
'full_name': 'Number of valid observation'
},
'sm': {
'full_name': self.general_attrs.sm_full_name,
'units': self.general_attrs.sm_units
}
}
_prod = sensor_type.upper()
_freq = self.freq.upper()
_cdr = self.cdr_type.upper()
_vers = self.version
product_name = " ".join([
'C3S', 'SOILMOISTURE', 'L3S',
self.general_attrs.product_datatype_str[sensor_type].upper(),
_prod, _freq, _cdr, _vers
])
self.global_attr = {
'product_full_name': product_name,
'product': str(_prod),
'temporal_sampling': str(_freq),
'cdr': str(_cdr),
'version': str(_vers),
'resolution': '0.25 degree'
}