10 from __future__
import print_function
14 from datetime
import datetime, timedelta
17 import dateutil.parser
19 from pathlib
import Path
21 IODA_CONV_PATH = Path(__file__).parent/
"@SCRIPT_LIB_PATH@"
22 if not IODA_CONV_PATH.is_dir():
23 IODA_CONV_PATH = Path(__file__).parent/
'..'/
'lib-python'
24 sys.path.append(
str(IODA_CONV_PATH.resolve()))
26 import ioda_conv_ncio
as iconv
27 from orddicts
import DefaultOrderedDict
30 vName =
"brightness_temperature"
33 (
"latitude",
"float"),
34 (
"longitude",
"float"),
35 (
"datetime",
"string")
54 ncVar = ncd.variables[inName]
55 mData[outName] = self.
writerwriter.FillNcVector(ncVar[:], dType)
56 if 'units' in ncVar.ncattrs():
57 self.
units_valuesunits_values[outName] = ncVar.getncattr(
'units')
61 ncVar = ncd.variables[inName]
63 mData[outName] = self.
writerwriter.FillNcVector(ncVar[:], dType)
64 if 'units' in ncVar.ncattrs():
65 self.
units_valuesunits_values[outName] = ncVar.getncattr(
'units')
67 mData[outName] = np.append(mData[outName], self.
writerwriter.FillNcVector(ncVar[:], dType), axis=0)
102 valKey = vName, self.
writerwriter.OvalName()
103 errKey = vName, self.
writerwriter.OerrName()
104 qcKey = vName, self.
writerwriter.OqcName()
107 self.
writerwriter._nlocs = 0
108 giirsfiletxt = open(self.
filenamesfilenames[0],
'r')
109 giirsfiles = giirsfiletxt.readlines()
112 for ff
in giirsfiles:
115 ncd = nc.Dataset(f,
'r')
118 nlocs = ncd.dimensions[
"LWdetector"].size
119 nchans = ncd.dimensions[
"LWchannel"].size
120 self.
writerwriter._nlocs += nlocs
121 self.
writerwriter._nvars = nchans
122 self.
writerwriter._nrecs = 1
126 self.
xferMdataVarxferMdataVar(ncd,
'LW_wnum',
'channel_wavenumber', VarMdata,
'float')
128 VarMdata[
'channel_number'] = self.
writerwriter.FillNcVector(
129 np.ma.array(range(1, nchans+1)),
'integer')
140 obsDate = ncd.getncattr(
"Observing Beginning Date").split(
"-")
141 obsTime = ncd.getncattr(
"Observing Beginning Time").split(
":")
142 obsSeconds = timedelta(seconds=
int(round(float(obsTime[2]))))
143 obsDateTime = datetime(year=
int(obsDate[0]), month=
int(obsDate[1]),
144 day=
int(obsDate[2]), hour=
int(obsTime[0]),
145 minute=
int(obsTime[1])) + obsSeconds
146 obsDtimeString = obsDateTime.strftime(
"%Y-%m-%dT%H:%M:%SZ")
150 LocMdata[
'datetime'] = self.
writerwriter.FillNcVector(
151 np.full((nlocs), obsDtimeString),
'datetime')
152 self.
units_valuesunits_values[
'datetime'] =
'ISO 8601 format'
154 LocMdata[
'datetime'] = np.append(LocMdata[
'datetime'], self.
writerwriter.FillNcVector(np.full((nlocs), obsDtimeString),
'datetime'), axis=0)
157 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_Latitude',
'latitude', LocMdata,
'float')
158 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_Longitude',
'longitude', LocMdata,
'float')
160 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_Longitude',
'scan_position', LocMdata,
'integer')
163 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SolarZenith',
'solar_zenith_angle', LocMdata,
'float')
164 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SolarAzimuth',
'solar_azimuth_angle', LocMdata,
'float')
165 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SatelliteZenith',
'sensor_zenith_angle', LocMdata,
'float')
166 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SatelliteZenith',
'sensor_view_angle', LocMdata,
'float')
167 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SatelliteAzimuth',
'sensor_azimuth_angle', LocMdata,
'float')
171 ncVar = ncd.variables[
'ES_RealLW']
172 lwRadiance = ncVar[:]
173 print(self.
writerwriter._nlocs)
180 wn_lw=np.arange(700,1130.001,0.625)
181 wn_mw=np.arange(1650,2250.001,0.625)
182 TBB = lwRadiance*0-999
184 for iloc
in range(nlocs):
185 for ivar
in range(1,nchans-1):
187 lwRadiance_apo = 0.23*lwRadiance[ivar-1,iloc] +0.54*lwRadiance[ivar,iloc] + 0.23*lwRadiance[ivar+1,iloc]
189 TBB[ivar,iloc] = C2*wn_lw[ivar]/math.log(C1*wn_lw[ivar]**3/lwRadiance_apo+1)
192 lwRadiance_apo = lwRadiance[ivar,iloc]
193 TBB[ivar,iloc] = C2*wn_lw[ivar]/math.log(C1*wn_lw[ivar]**3/lwRadiance_apo+1)
195 lwRadiance_apo = lwRadiance[ivar,iloc]
196 TBB[ivar,iloc] = C2*wn_lw[ivar]/math.log(C1*wn_lw[ivar]**3/lwRadiance_apo+1)
198 if 'units' in ncVar.ncattrs():
199 Units = ncVar.getncattr(
'units')
202 for ivar
in range(nchans):
203 varName =
"brightness_temperature_%d" % (ivar + 1)
205 self.
datadata[(varName,
'ObsValue')] = self.
writerwriter.FillNcVector(TBB[ivar, :],
'float')
206 self.
datadata[(varName,
'PreQC')] = self.
writerwriter.FillNcVector(np.full((nlocs), 0),
'integer')
207 self.
datadata[(varName,
'ObsError')] = self.
writerwriter.FillNcVector(np.full((nlocs), 2.0),
'float')
209 self.
datadata[(varName,
'ObsValue')] = np.append(self.
datadata[(varName,
'ObsValue')], self.
writerwriter.FillNcVector(TBB[ivar, :],
'float'), axis=0)
210 self.
datadata[(varName,
'PreQC')] = np.append(self.
datadata[(varName,
'PreQC')], self.
writerwriter.FillNcVector(np.full((nlocs), 0),
'integer'), axis=0)
211 self.
datadata[(varName,
'ObsError')] = np.append(self.
datadata[(varName,
'ObsError')], self.
writerwriter.FillNcVector(np.full((nlocs), 2.0),
'float'), axis=0)
220 parser = argparse.ArgumentParser(
222 'Read NSMC GIIRS long wave radiance file(s) and convert'
223 ' to a concatenated IODA formatted output file.')
225 required = parser.add_argument_group(title=
'required arguments')
226 required.add_argument(
228 help=
"file name of giirs input file(s)",
229 type=str, nargs=
'+', required=
True)
230 required.add_argument(
232 help=
"name of ioda output file",
233 type=str, required=
True)
234 required.add_argument(
236 help=
"base date for the center of the window",
237 metavar=
"YYYYMMDDHH", type=str, required=
True)
238 args = parser.parse_args()
239 fdate = datetime.strptime(args.date,
'%Y%m%d%H')
241 writer = iconv.NcWriter(args.output, [], locationKeyList)
248 AttrData[
'date_time_string'] = fdate.strftime(
"%Y-%m-%dT%H:%M:%SZ")
251 writer.BuildNetcdf(lwrad.data, RecMdata, LocMdata, VarMdata, AttrData, lwrad.units_values)
254 if __name__ ==
'__main__':
def xferMdataVar(self, ncd, inName, outName, mData, dType)
def __init__(self, filenames, writer)
def xferLocMdataVar(self, ncd, numFiles, inName, outName, mData, dType)