10 from __future__
import print_function
14 from datetime
import datetime, timedelta
17 import dateutil.parser
18 from pathlib
import Path
20 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
21 if not IODA_CONV_PATH.is_dir():
22 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
23 sys.path.append(
str(IODA_CONV_PATH.resolve()))
25 import ioda_conv_ncio
as iconv
26 from orddicts
import DefaultOrderedDict
29 vName =
"longwave_radiance"
32 (
"latitude",
"float"),
33 (
"longitude",
"float"),
34 (
"datetime",
"string")
52 ncVar = ncd.variables[inName]
53 mData[outName] = self.
writerwriter.FillNcVector(ncVar[:], dType)
54 if 'units' in ncVar.ncattrs():
55 self.
units_valuesunits_values[outName] = ncVar.getncattr(
'units')
90 valKey = vName, self.
writerwriter.OvalName()
91 errKey = vName, self.
writerwriter.OerrName()
92 qcKey = vName, self.
writerwriter.OqcName()
95 ncd = nc.Dataset(f,
'r')
98 nlocs = ncd.dimensions[
"LWdetector"].size
99 nchans = ncd.dimensions[
"LWchannel"].size
100 self.
writerwriter._nlocs = nlocs
101 self.
writerwriter._nvars = nchans
104 self.
xferMdataVarxferMdataVar(ncd,
'LW_wnum',
'channel_wavenumber', VarMdata,
'float')
106 VarMdata[
'channel_number'] = self.
writerwriter.FillNcVector(
107 np.ma.array(range(1, nchans+1)),
'integer')
118 obsDate = ncd.getncattr(
"Observing Beginning Date").split(
"-")
119 obsTime = ncd.getncattr(
"Observing Beginning Time").split(
":")
120 obsSeconds = timedelta(seconds=
int(round(float(obsTime[2]))))
121 obsDateTime = datetime(year=
int(obsDate[0]), month=
int(obsDate[1]),
122 day=
int(obsDate[2]), hour=
int(obsTime[0]),
123 minute=
int(obsTime[1])) + obsSeconds
124 obsDtimeString = obsDateTime.strftime(
"%Y-%m-%dT%H:%M:%SZ")
127 LocMdata[
'datetime'] = self.
writerwriter.FillNcVector(
128 np.full((nlocs), obsDtimeString),
'datetime')
129 self.
units_valuesunits_values[
'datetime'] =
'ISO 8601 format'
132 self.
xferMdataVarxferMdataVar(ncd,
'IRLW_Latitude',
'latitude', LocMdata,
'float')
133 self.
xferMdataVarxferMdataVar(ncd,
'IRLW_Longitude',
'longitude', LocMdata,
'float')
136 self.
xferMdataVarxferMdataVar(ncd,
'IRLW_SolarZenith',
'solar_zenith_angle', LocMdata,
'float')
137 self.
xferMdataVarxferMdataVar(ncd,
'IRLW_SolarAzimuth',
'solar_azimuth_angle', LocMdata,
'float')
138 self.
xferMdataVarxferMdataVar(ncd,
'IRLW_SatelliteZenith',
'sensor_zenith_angle', LocMdata,
'float')
139 self.
xferMdataVarxferMdataVar(ncd,
'IRLW_SatelliteAzimuth',
'sensor_azimuth_angle', LocMdata,
'float')
143 ncVar = ncd.variables[
'ES_RealLW']
144 lwRadiance = ncVar[:]
145 if 'units' in ncVar.ncattrs():
146 Units = ncVar.getncattr(
'units')
149 for ivar
in range(nchans):
150 varName =
"longwave_radiance_%d" % (ivar + 1)
151 self.
datadata[(varName,
'ObsValue')] = self.
writerwriter.FillNcVector(
152 lwRadiance[ivar, :],
'float')
153 self.
datadata[(varName,
'PreQC')] = self.
writerwriter.FillNcVector(
154 np.full((nlocs), 0),
'integer')
155 self.
datadata[(varName,
'ObsError')] = self.
writerwriter.FillNcVector(
156 np.full((nlocs), 2.0),
'float')
165 parser = argparse.ArgumentParser(
167 'Read NSMC GIIRS long wave radiance file(s) and convert'
168 ' to a concatenated IODA formatted output file.')
170 required = parser.add_argument_group(title=
'required arguments')
171 required.add_argument(
173 help=
"name of giirs input file(s)",
174 type=str, nargs=
'+', required=
True)
175 required.add_argument(
177 help=
"name of ioda output file",
178 type=str, required=
True)
179 required.add_argument(
181 help=
"base date for the center of the window",
182 metavar=
"YYYYMMDDHH", type=str, required=
True)
183 args = parser.parse_args()
184 fdate = datetime.strptime(args.date,
'%Y%m%d%H')
186 writer = iconv.NcWriter(args.output, [], locationKeyList)
193 AttrData[
'date_time_string'] = fdate.strftime(
"%Y-%m-%dT%H:%M:%SZ")
196 writer.BuildNetcdf(lwrad.data, LocMdata, VarMdata, AttrData, lwrad.units_values)
199 if __name__ ==
'__main__':
def xferMdataVar(self, ncd, inName, outName, mData, dType)
def __init__(self, filenames, writer)