IODA Bundle
ndbc_hfradar2ioda.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 # ioda-converter for National Data Buoy Center High Frequency Radar radial velocity
4 # Script modified by Ling Liu (IMSG@NOAA/NCEP/EMC)
5 
6 from __future__ import print_function
7 import numpy as np
8 import numpy.matlib
9 import sys
10 import argparse
11 import netCDF4 as nc
12 from datetime import datetime, timedelta
13 import dateutil.parser
14 from pathlib import Path
15 
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()))
20 
21 import ioda_conv_ncio as iconv
22 from orddicts import DefaultOrderedDict
23 
24 vName = ["sea_water_meridional_current",
25  "sea_water_zonal_current"]
26 
27 
28 locationKeyList = [
29  ("latitude", "float"),
30  ("longitude", "float"),
31  ("datetime", "string")
32 ]
33 
34 AttrData = {
35  'odb_version': 1,
36 }
37 
38 
39 class Observation(object):
40 
41  def __init__(self, filename, date, writer):
42 
43  self.filenamefilename = filename
44  self.datedate = date
45  self.datadata = DefaultOrderedDict(lambda: DefaultOrderedDict(dict))
46  self.writerwriter = writer
47  self._read_read()
48 
49  def _read(self):
50 
51  ncd = nc.MFDataset(self.filenamefilename)
52  time = ncd.variables['time'][:]
53  lons = ncd.variables['lon'][:]
54  lats = ncd.variables['lat'][:]
55  vals_u = ncd.variables['u'][:]
56  vals_v = ncd.variables['v'][:]
57  units = '1970-01-01 00:00:00'
58  reftime = dateutil.parser.parse(units)
59  ncd.close()
60  lons, lats = np.meshgrid(lons, lats)
61  lons = lons.flatten()
62  lats = lats.flatten()
63  vals_u = vals_u.flatten()
64  vals_v = vals_v.flatten()
65  time = np.matlib.repmat(time, len(lons), 1)
66  count = 0
67  for i in range(len(lons)):
68  for j in [0, 1]:
69  valKey = vName[j], self.writerwriter.OvalName()
70  errKey = vName[j], self.writerwriter.OerrName()
71  qcKey = vName[j], self.writerwriter.OqcName()
72  if vals_u[i] != '--':
73  count += 1
74  obs_date = reftime + timedelta(seconds=int(time[i]))
75  locKey = lats[i], lons[i], obs_date.strftime("%Y-%m-%dT%H:%M:%SZ")
76  if j == 0:
77  self.datadata[0][locKey][valKey] = vals_u[i]
78  self.datadata[0][locKey][errKey] = 0.1
79  self.datadata[0][locKey][qcKey] = 0
80  else:
81  self.datadata[0][locKey][valKey] = vals_v[i]
82  self.datadata[0][locKey][errKey] = 0.1
83  self.datadata[0][locKey][qcKey] = 0
84 
85 
86 def main():
87 
88  # Get command line arguments
89  parser = argparse.ArgumentParser(
90  description=(
91  'Reads marine HF radar radial velocity from archiving'
92  'and converts into IODA formatted'
93  'output files')
94  )
95 
96  required = parser.add_argument_group(title='required arguments')
97  required.add_argument(
98  '-i', '--input',
99  help="Radar observation input file(s)",
100  type=str, nargs='+', required=True)
101  required.add_argument(
102  '-o', '--output',
103  help="path of ioda output file",
104  type=str, required=True)
105  required.add_argument(
106  '-d', '--date',
107  help="base date for the center of the window",
108  metavar="YYYYMMDDHH", type=str, required=True)
109 
110  args = parser.parse_args()
111  fdate = datetime.strptime(args.date, '%Y%m%d%H')
112  writer = iconv.NcWriter(args.output, locationKeyList)
113 
114  # Read in the altimeter
115  altim = Observation(args.input, fdate, writer)
116 
117  # write them out
118  AttrData['date_time_string'] = fdate.strftime("%Y-%m-%dT%H:%M:%SZ")
119 
120  (ObsVars, LocMdata, VarMdata) = writer.ExtractObsData(altim.data)
121  writer.BuildNetcdf(ObsVars, LocMdata, VarMdata, AttrData)
122 
123 
124 if __name__ == '__main__':
125  main()
def __init__(self, filename, date, writer)