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
110 ncd = nc.Dataset(f,
'r')
113 nlocs = ncd.dimensions[
"LWdetector"].size
114 nchans = ncd.dimensions[
"LWchannel"].size
115 self.
writerwriter._nlocs += nlocs
116 self.
writerwriter._nvars = nchans
117 self.
writerwriter._nrecs = 1
121 self.
xferMdataVarxferMdataVar(ncd,
'LW_wnum',
'channel_wavenumber', VarMdata,
'float')
123 VarMdata[
'channel_number'] = self.
writerwriter.FillNcVector(
124 np.ma.array(range(1, nchans+1)),
'integer')
135 obsDate = ncd.getncattr(
"Observing Beginning Date").split(
"-")
136 obsTime = ncd.getncattr(
"Observing Beginning Time").split(
":")
137 obsSeconds = timedelta(seconds=
int(round(float(obsTime[2]))))
138 obsDateTime = datetime(year=
int(obsDate[0]), month=
int(obsDate[1]),
139 day=
int(obsDate[2]), hour=
int(obsTime[0]),
140 minute=
int(obsTime[1])) + obsSeconds
141 obsDtimeString = obsDateTime.strftime(
"%Y-%m-%dT%H:%M:%SZ")
145 LocMdata[
'datetime'] = self.
writerwriter.FillNcVector(
146 np.full((nlocs), obsDtimeString),
'datetime')
147 self.
units_valuesunits_values[
'datetime'] =
'ISO 8601 format'
149 LocMdata[
'datetime'] = np.append(LocMdata[
'datetime'], self.
writerwriter.FillNcVector(np.full((nlocs), obsDtimeString),
'datetime'), axis=0)
152 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_Latitude',
'latitude', LocMdata,
'float')
153 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_Longitude',
'longitude', LocMdata,
'float')
155 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_Longitude',
'scan_position', LocMdata,
'integer')
158 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SolarZenith',
'solar_zenith_angle', LocMdata,
'float')
159 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SolarAzimuth',
'solar_azimuth_angle', LocMdata,
'float')
160 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SatelliteZenith',
'sensor_zenith_angle', LocMdata,
'float')
161 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SatelliteZenith',
'sensor_view_angle', LocMdata,
'float')
162 self.
xferLocMdataVarxferLocMdataVar(ncd, numFiles,
'IRLW_SatelliteAzimuth',
'sensor_azimuth_angle', LocMdata,
'float')
166 ncVar = ncd.variables[
'ES_RealLW']
167 lwRadiance = ncVar[:]
168 print(self.
writerwriter._nlocs)
175 wn_lw=np.arange(700,1130.001,0.625)
176 wn_mw=np.arange(1650,2250.001,0.625)
177 TBB = lwRadiance*0-999
179 for iloc
in range(nlocs):
180 for ivar
in range(1,nchans-1):
182 lwRadiance_apo = 0.23*lwRadiance[ivar-1,iloc] +0.54*lwRadiance[ivar,iloc] + 0.23*lwRadiance[ivar+1,iloc]
184 TBB[ivar,iloc] = C2*wn_lw[ivar]/math.log(C1*wn_lw[ivar]**3/lwRadiance_apo+1)
187 lwRadiance_apo = lwRadiance[ivar,iloc]
188 TBB[ivar,iloc] = C2*wn_lw[ivar]/math.log(C1*wn_lw[ivar]**3/lwRadiance_apo+1)
190 lwRadiance_apo = lwRadiance[ivar,iloc]
191 TBB[ivar,iloc] = C2*wn_lw[ivar]/math.log(C1*wn_lw[ivar]**3/lwRadiance_apo+1)
193 if 'units' in ncVar.ncattrs():
194 Units = ncVar.getncattr(
'units')
197 for ivar
in range(nchans):
198 varName =
"brightness_temperature_%d" % (ivar + 1)
200 self.
datadata[(varName,
'ObsValue')] = self.
writerwriter.FillNcVector(TBB[ivar, :],
'float')
201 self.
datadata[(varName,
'PreQC')] = self.
writerwriter.FillNcVector(np.full((nlocs), 0),
'integer')
202 self.
datadata[(varName,
'ObsError')] = self.
writerwriter.FillNcVector(np.full((nlocs), 2.0),
'float')
204 self.
datadata[(varName,
'ObsValue')] = np.append(self.
datadata[(varName,
'ObsValue')], self.
writerwriter.FillNcVector(TBB[ivar, :],
'float'), axis=0)
205 self.
datadata[(varName,
'PreQC')] = np.append(self.
datadata[(varName,
'PreQC')], self.
writerwriter.FillNcVector(np.full((nlocs), 0),
'integer'), axis=0)
206 self.
datadata[(varName,
'ObsError')] = np.append(self.
datadata[(varName,
'ObsError')], self.
writerwriter.FillNcVector(np.full((nlocs), 2.0),
'float'), axis=0)
215 parser = argparse.ArgumentParser(
217 'Read NSMC GIIRS long wave radiance file(s) and convert'
218 ' to a concatenated IODA formatted output file.')
220 required = parser.add_argument_group(title=
'required arguments')
221 required.add_argument(
223 help=
"name of giirs input file(s)",
224 type=str, nargs=
'+', required=
True)
225 required.add_argument(
227 help=
"name of ioda output file",
228 type=str, required=
True)
229 required.add_argument(
231 help=
"base date for the center of the window",
232 metavar=
"YYYYMMDDHH", type=str, required=
True)
233 args = parser.parse_args()
234 fdate = datetime.strptime(args.date,
'%Y%m%d%H')
236 writer = iconv.NcWriter(args.output, [], locationKeyList)
243 AttrData[
'date_time_string'] = fdate.strftime(
"%Y-%m-%dT%H:%M:%SZ")
246 writer.BuildNetcdf(lwrad.data, RecMdata, LocMdata, VarMdata, AttrData, lwrad.units_values)
249 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)