13 from datetime
import datetime, timedelta
14 from pathlib
import Path
16 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
17 if not IODA_CONV_PATH.is_dir():
18 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
19 sys.path.append(
str(IODA_CONV_PATH.resolve()))
21 import ioda_conv_ncio
as iconv
22 from collections
import defaultdict, OrderedDict
23 from orddicts
import DefaultOrderedDict
26 (
"latitude",
"float"),
27 (
"longitude",
"float"),
28 (
"datetime",
"string")
32 'snow_cover_fraction':
'snowCover',
36 'converter': os.path.basename(__file__),
46 self.
varDictvarDict = defaultdict(
lambda: defaultdict(dict))
56 for iodavar
in [
'snowCover']:
57 self.
varDictvarDict[iodavar][
'valKey'] = iodavar, self.
writerwriter.OvalName()
58 self.
varDictvarDict[iodavar][
'errKey'] = iodavar, self.
writerwriter.OerrName()
59 self.
varDictvarDict[iodavar][
'qcKey'] = iodavar, self.
writerwriter.OqcName()
60 self.
unitsunits[iodavar] =
'%'
62 data = pygrib.open(self.
filenamefilename)
63 lat, lon = data[1].latlons()
66 vals = data.select(name=
'Snow cover')[0].values[:].ravel()
69 qflg = 0*vals.astype(
'int32')
70 times = np.empty_like(vals, dtype=object)
72 if self.
maskmask ==
"maskout":
73 mask = np.logical_not(vals.mask)
81 start_datetime = data[1].analDate
82 base_datetime = start_datetime.isoformat() +
"Z"
87 self.
sensorsensor =
"IMS.Multisensor"
88 AttrData[
"observation_type"] =
"Snow Cover Fraction"
89 AttrData[
"satellite"] = self.
satellitesatellite
90 AttrData[
"sensor"] = self.
sensorsensor
91 AttrData[
'date_time_string'] = base_datetime
93 for i
in range(len(lons)):
94 times[i] = base_datetime
95 self.
loc_mdataloc_mdata[
'datetime'] = self.
writerwriter.FillNcVector(times,
"datetime")
96 self.
loc_mdataloc_mdata[
'latitude'] = lats
97 self.
loc_mdataloc_mdata[
'longitude'] = lons
98 for iodavar
in [
'snowCover']:
100 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'errKey']] = errs
102 self.
writerwriter._nvars = len(obsvars)
108 parser = argparse.ArgumentParser(
109 description=(
'Read IMS snow cover fraction file(s) and Converter'
110 ' of native grib2 format for observations of snow'
111 ' cover fraction to IODA netCDF format.')
113 parser.add_argument(
'-i',
'--input',
114 help=
"name of ims snow cover input file(s)",
115 type=str, required=
True)
116 parser.add_argument(
'-o',
'--output',
117 help=
"name of ioda output file",
118 type=str, required=
True)
119 optional = parser.add_argument_group(title=
'optional arguments')
120 optional.add_argument(
122 help=
"maskout missing values: maskout/default, default=none",
123 type=str, required=
True)
125 args = parser.parse_args()
127 writer = iconv.NcWriter(args.output, locationKeyList)
130 scf =
imsscf(args.input, args.mask, writer)
133 writer.BuildNetcdf(scf.outdata, scf.loc_mdata, scf.var_mdata, AttrData, scf.units)
136 if __name__ ==
'__main__':
def __init__(self, filename, mask, writer)