14 from datetime
import datetime, timedelta
15 from pathlib
import Path
17 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
18 if not IODA_CONV_PATH.is_dir():
19 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
20 sys.path.append(
str(IODA_CONV_PATH.resolve()))
22 import ioda_conv_ncio
as iconv
23 from collections
import defaultdict, OrderedDict
24 from orddicts
import DefaultOrderedDict
27 (
"latitude",
"float"),
28 (
"longitude",
"float"),
29 (
"datetime",
"string")
33 'snow_depth':
'snowDepth',
37 'converter': os.path.basename(__file__),
40 os.environ[
"TZ"] =
"UTC"
49 self.
varDictvarDict = defaultdict(
lambda: defaultdict(dict))
58 for iodavar
in [
'snowDepth']:
59 self.
varDictvarDict[iodavar][
'valKey'] = iodavar, self.
writerwriter.OvalName()
60 self.
varDictvarDict[iodavar][
'errKey'] = iodavar, self.
writerwriter.OerrName()
61 self.
varDictvarDict[iodavar][
'qcKey'] = iodavar, self.
writerwriter.OqcName()
62 self.
unitsunits[iodavar] =
'm'
63 data = pygrib.open(self.
filenamefilename)
64 lat, lon = data[1].latlons()
67 vals = data[1].values[:].ravel()
71 lat1 = data[1][
'latitudeOfFirstGridPointInDegrees']
72 lon1 = data[1][
'longitudeOfFirstGridPointInDegrees']
75 dx = data[1][
'DxInMetres']
76 dy = data[1][
'DyInMetres']
82 myparams = data[1].projparams
84 if myparams[
'lat_0'] == -90.0:
85 myparams[
'lat_ts'] = -60.0
87 pj = pyproj.Proj(myparams)
88 llcrnrx, llcrnry = pj(lon1, lat1)
89 x = llcrnrx - dx*np.arange(nx)
90 y = llcrnry + dy*np.arange(ny)
91 x, y = np.meshgrid(x, y)
92 lon, lat = pj(x, y, inverse=
True)
96 errs = 0.0*vals.astype(
'float32')
97 qflg = 0*vals.astype(
'int32')
98 times = np.empty_like(vals, dtype=object)
100 if self.
maskmask ==
"maskout":
101 mask = np.logical_not(vals.mask)
109 start_datetime = data[1].analDate
110 base_datetime = start_datetime.isoformat() +
"Z"
112 AttrData[
'date_time_string'] = base_datetime
114 for i
in range(len(lons)):
115 times[i] = base_datetime
116 self.
loc_mdataloc_mdata[
'datetime'] = self.
writerwriter.FillNcVector(times,
"datetime")
117 self.
loc_mdataloc_mdata[
'latitude'] = lats
118 self.
loc_mdataloc_mdata[
'longitude'] = lons
119 for iodavar
in [
'snowDepth']:
120 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'valKey']] = vals
121 self.
outdataoutdata[self.
varDictvarDict[iodavar][
'errKey']] = errs
123 self.
writerwriter._nvars = len(obsvars)
129 parser = argparse.ArgumentParser(
130 description=(
'Read AFWA snow depth file(s) and Converter'
131 ' of native grib format for observations of snow'
132 ' depth to IODA netCDF format.')
134 parser.add_argument(
'-i',
'--input',
135 help=
"name of afwa snow depth input file(s)",
136 type=str, required=
True)
137 parser.add_argument(
'-o',
'--output',
138 help=
"name of ioda output file",
139 type=str, required=
True)
140 optional = parser.add_argument_group(title=
'optional arguments')
141 optional.add_argument(
143 help=
"maskout missing values: maskout/default, default=none",
144 type=str, required=
True)
146 args = parser.parse_args()
148 writer = iconv.NcWriter(args.output, locationKeyList)
151 snod =
AFWA(args.input, args.mask, writer)
153 writer.BuildNetcdf(snod.outdata, snod.loc_mdata, snod.var_mdata, AttrData, snod.units)
156 if __name__ ==
'__main__':
def __init__(self, filename, mask, writer)