12 from datetime
import datetime, timedelta
13 from pathlib
import Path
15 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
16 if not IODA_CONV_PATH.is_dir():
17 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
18 sys.path.append(
str(IODA_CONV_PATH.resolve()))
20 import ioda_conv_ncio
as iconv
21 from collections
import defaultdict, OrderedDict
22 from orddicts
import DefaultOrderedDict
25 (
"latitude",
"float"),
26 (
"longitude",
"float"),
27 (
"datetime",
"string")
31 'soil_moisture':
'soilMoistureVolumetric',
35 'converter': os.path.basename(__file__),
45 self.
varDictvarDict = defaultdict(
lambda: defaultdict(dict))
55 for iodavar
in [
'soilMoistureVolumetric']:
56 self.
varDictvarDict[iodavar][
'valKey'] = iodavar, self.
writerwriter.OvalName()
57 self.
varDictvarDict[iodavar][
'errKey'] = iodavar, self.
writerwriter.OerrName()
58 self.
varDictvarDict[iodavar][
'qcKey'] = iodavar, self.
writerwriter.OqcName()
59 self.
unitsunits[iodavar] =
'm3m-3'
61 ncd = nc.Dataset(self.
filenamefilename,
'r')
63 AttrData[
"observation_type"] =
"surface soil moisture"
64 AttrData[
"satellite"] =
"SMOS"
65 AttrData[
"sensor"] =
"MIRAS"
67 lons = ncd.variables[
'longitude'][:]
68 lats = ncd.variables[
'latitude'][:]
69 vals = ncd.variables[
'soil_moisture'][:]
70 errs = ncd.variables[
'soil_moisture_uncertainty'][:]
71 rfip = ncd.variables[
'RFI_probability'][:]
72 ddys = ncd.variables[
'days_since_01-01-2000'][:]
73 secs = ncd.variables[
'seconds_since_midnight'][:]
74 times = np.empty_like(vals, dtype=object)
76 qflg = rfip.astype(
'int32')
78 if self.
maskmask ==
"maskout":
90 for i
in range(len(lons)):
98 base_date = datetime(2000, 1, 1) + timedelta(days=
int(ddys[i]))
99 dt = base_date + timedelta(seconds=
int(secs[i]))
100 base_datetime = dt.strftime(
"%Y-%m-%dT%H:%M:%SZ")
101 AttrData[
'date_time_string'] = base_datetime
102 times[i] = base_datetime
104 self.
loc_mdataloc_mdata[
'datetime'] = self.
writerwriter.FillNcVector(times,
"datetime")
105 self.
loc_mdataloc_mdata[
'latitude'] = lats
106 self.
loc_mdataloc_mdata[
'longitude'] = lons
107 for iodavar
in [
'soilMoistureVolumetric']:
108 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'valKey']] = vals
109 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'errKey']] = errs
111 self.
writerwriter._nvars = len(obsvars)
117 parser = argparse.ArgumentParser(
118 description=(
'Read SMOS surface soil moisture file(s) and Converter'
119 ' of native NetCDF format for observations of soil'
120 ' moisture from SMOS to IODA netCDF format.')
122 parser.add_argument(
'-i',
'--input',
123 help=
"name of smos soil moisture input file(s)",
124 type=str, required=
True)
125 parser.add_argument(
'-o',
'--output',
126 help=
"name of ioda output file",
127 type=str, required=
True)
128 optional = parser.add_argument_group(title=
'optional arguments')
129 optional.add_argument(
131 help=
"maskout missing values: maskout/default, default=none",
132 type=str, required=
True)
134 args = parser.parse_args()
136 writer = iconv.NcWriter(args.output, locationKeyList)
139 ssm =
SMOS_L2NRT(args.input, args.mask, writer)
142 writer.BuildNetcdf(ssm.outdata, ssm.loc_mdata, ssm.var_mdata, AttrData, ssm.units)
145 if __name__ ==
'__main__':
def __init__(self, filename, mask, writer)