13 from datetime
import datetime, timedelta
16 import dateutil.parser
17 from pathlib
import Path
19 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
20 if not IODA_CONV_PATH.is_dir():
21 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
22 sys.path.append(
str(IODA_CONV_PATH.resolve()))
24 import ioda_conv_ncio
as iconv
25 from orddicts
import DefaultOrderedDict
28 vName =
"sea_surface_salinity"
31 (
"latitude",
"float"),
32 (
"longitude",
"float"),
33 (
"datetime",
"string")
51 valKey = vName, self.
writerwriter.OvalName()
52 errKey = vName, self.
writerwriter.OerrName()
53 qcKey = vName, self.
writerwriter.OqcName()
56 print(
" Reading file: ", f)
57 ncd = nc.Dataset(f,
'r')
61 source = ncd.institution
62 if re.search(
"^Remote Sensing Systems.*", source)
is not None:
71 elif re.search(
"^JPL.*", source)
is not None:
78 'sss_err':
'smap_sss_uncertainty',
79 'sss_qc':
'quality_flag'
82 print(
"Error: unknown source: " + source)
83 print(
"Only JPL or RSS sources are handled")
88 if ncd.processing_level[:2] !=
'L2':
89 print(
"Error: only L2 files handled for now.")
94 ncd.variables[source_var_name[
'time']].units.split(
' ')[2:3])
95 basetime = dateutil.parser.parse(s)
99 for v
in source_var_name:
101 data[v] = ncd.variables[source_var_name[v]][:].flatten().astype(int)
103 data[v] = ncd.variables[source_var_name[v]][:].flatten()
108 col = len(data[
'lon']) / len(data[
'time'])
109 data[
'time'] = np.tile(
110 np.array(data[
'time']), (
int(col), 1)).T.flatten()
113 mask = np.logical_not(data[
'sss'].mask)
114 for v
in source_var_name:
115 data[v] = data[v][mask]
118 for i
in range(len(data[
'time'])):
119 obs_date = basetime + timedelta(seconds=float(data[
'time'][i]))
120 locKey = data[
'lat'][i], data[
'lon'][i], obs_date.strftime(
121 "%Y-%m-%dT%H:%M:%SZ")
122 self.
datadata[0][locKey][valKey] = data[
'sss'][i]
128 self.
datadata[0][locKey][qcKey] = data[
'sss_qc'][i]
129 if 'sss_err' in data:
130 self.
datadata[0][locKey][errKey] = data[
'sss_err'][i]
132 self.
datadata[0][locKey][errKey] = 1.0
138 parser = argparse.ArgumentParser(
140 'Read JPL/RSS SMAP sea surface salinity (SSS) file(s) and convert'
141 ' to a concatenated IODA formatted output file.')
143 required = parser.add_argument_group(title=
'required arguments')
144 required.add_argument(
146 help=
"name of sss input file(s)",
147 type=str, nargs=
'+', required=
True)
148 required.add_argument(
150 help=
"name of ioda output file",
151 type=str, required=
True)
152 required.add_argument(
154 help=
"base date for the center of the window",
155 metavar=
"YYYYMMDDHH", type=str, required=
True)
156 args = parser.parse_args()
157 fdate = datetime.strptime(args.date,
'%Y%m%d%H')
159 writer = iconv.NcWriter(args.output, locationKeyList)
162 sal =
Salinity(args.input, fdate, writer)
165 AttrData[
'date_time_string'] = fdate.strftime(
"%Y-%m-%dT%H:%M:%SZ")
167 (ObsVars, LocMdata, VarMdata) = writer.ExtractObsData(sal.data)
168 writer.BuildNetcdf(ObsVars, LocMdata, VarMdata, AttrData)
171 if __name__ ==
'__main__':
def __init__(self, filenames, date, writer)