14 from datetime
import datetime, timedelta
16 from pathlib
import Path
18 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
19 if not IODA_CONV_PATH.is_dir():
20 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
21 sys.path.append(
str(IODA_CONV_PATH.resolve()))
23 import ioda_conv_ncio
as iconv
24 from collections
import defaultdict, OrderedDict
25 from orddicts
import DefaultOrderedDict
28 (
"latitude",
"float"),
29 (
"longitude",
"float"),
30 (
"datetime",
"string")
34 'soil_moisture':
'soilMoistureNormalized',
38 'converter': os.path.basename(__file__),
47 self.
varDictvarDict = defaultdict(
lambda: defaultdict(dict))
57 for iodavar
in [
'soilMoistureNormalized']:
58 self.
varDictvarDict[iodavar][
'valKey'] = iodavar, self.
writerwriter.OvalName()
59 self.
varDictvarDict[iodavar][
'errKey'] = iodavar, self.
writerwriter.OerrName()
60 self.
varDictvarDict[iodavar][
'qcKey'] = iodavar, self.
writerwriter.OqcName()
61 self.
unitsunits[iodavar] =
'%'
63 ncd = nc.Dataset(self.
filenamefilename,
'r')
65 AttrData[
"satellite"] = ncd.getncattr(
'source')
66 AttrData[
'platform'] = ncd.getncattr(
'platform_long_name')
68 lats = ncd.variables[
'lat'][:].ravel()
69 lons = ncd.variables[
'lon'][:].ravel()
70 vals = ncd.variables[
'soil_moisture'][:].ravel()
71 errs = ncd.variables[
'soil_moisture_error'][:].ravel()
72 wflg = ncd.variables[
'wetland_flag'][:].ravel()
73 tflg = ncd.variables[
'topography_flag'][:].ravel()
74 times = np.empty_like(vals, dtype=object)
76 num_cells = ncd.dimensions[
'numCells'].size
77 secs = ncd.variables[
'record_start_time'][:].ravel()
78 secs = np.repeat(secs, num_cells)
79 qflg = 0*vals.astype(
'int32')
80 wflg = wflg.astype(
'int32')
81 tflg = tflg.astype(
'int32')
83 if self.
maskmask ==
"maskout":
84 mask = np.logical_not(vals.mask)
95 for i
in range(len(lons)):
96 base_date = datetime(2000, 1, 1) + timedelta(seconds=
int(secs[i]))
97 base_datetime = base_date.strftime(
"%Y-%m-%dT%H:%M:%SZ")
98 AttrData[
'date_time_string'] = base_datetime
99 times[i] = base_datetime
101 self.
loc_mdataloc_mdata[
'datetime'] = self.
writerwriter.FillNcVector(times,
"datetime")
102 self.
loc_mdataloc_mdata[
'latitude'] = lats
103 self.
loc_mdataloc_mdata[
'longitude'] = lons
104 self.
loc_mdataloc_mdata[
'wetlandFraction'] = wflg
105 self.
loc_mdataloc_mdata[
'topographyComplexity'] = tflg
106 for iodavar
in [
'soilMoistureNormalized']:
107 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'valKey']] = vals
108 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'errKey']] = errs
110 self.
writerwriter._nvars = len(obsvars)
117 parser = argparse.ArgumentParser(
119 'Reads ASCAT L2NRT SM netCDF file(s) provided by EUMETSAT'
120 ' and converts into IODA formatted output file.')
122 required = parser.add_argument_group(title=
'required arguments')
123 required.add_argument(
125 help=
"name of ASCAT L2NRT SM observation netCDF input file(s)",
126 type=str, required=
True)
127 required.add_argument(
129 help=
"path of IODA output file",
130 type=str, required=
True)
131 optional = parser.add_argument_group(title=
'optional arguments')
132 optional.add_argument(
134 help=
"maskout missing values: maskout/default, default=none",
135 type=str, required=
True)
137 args = parser.parse_args()
140 writer = iconv.NcWriter(args.output, locationKeyList)
143 ssm =
ascat(args.input, args.mask, writer)
146 writer.BuildNetcdf(ssm.outdata, ssm.loc_mdata, ssm.var_mdata, AttrData, ssm.units)
149 if __name__ ==
'__main__':
def __init__(self, filename, mask, writer)