IODA Bundle
smos_sss2ioda.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 
3 #
4 # (C) Copyright 2021 UCAR
5 #
6 # This software is licensed under the terms of the Apache Licence Version 2.0
7 # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
8 #
9 
10 import sys
11 import argparse
12 import numpy as np
13 from datetime import datetime, timedelta
14 import netCDF4 as nc
15 from pathlib import Path
16 
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()))
21 
22 import ioda_conv_ncio as iconv
23 from orddicts import DefaultOrderedDict
24 
25 
26 vName = "sea_surface_salinity"
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 Salinity(object):
40  def __init__(self, filenames, date, writer):
41  self.filenamesfilenames = filenames
42  self.datedate = date
43  self.datadata = DefaultOrderedDict(lambda: DefaultOrderedDict(dict))
44  self.writerwriter = writer
45  self._read_read()
46 
47  # Open obs file and read/load relevant info
48  def _read(self):
49  valKey = vName, self.writerwriter.OvalName()
50  errKey = vName, self.writerwriter.OerrName()
51  qcKey = vName, self.writerwriter.OqcName()
52 
53  for f in self.filenamesfilenames:
54  print(" Reading file: ", f)
55  ncd = nc.Dataset(f, 'r')
56 
57  source_var_name = {
58  'lat': 'Latitude',
59  'lon': 'Longitude',
60  'sss': 'SSS_corr',
61  'sss_err': 'Sigma_SSS_corr',
62  'sss_qc': 'Dg_quality_SSS_corr'
63  }
64  lon = ncd.variables['Longitude'][:]
65  lat = ncd.variables['Latitude'][:]
66  sss = ncd.variables['SSS_corr'][:]
67  sss_err = ncd.variables['Sigma_SSS_corr'][:]
68  sss_qc = ncd.variables['Dg_quality_SSS_corr'][:]
69  sss_qc = sss_qc.astype(int)
70 
71  mask = np.logical_not(sss.mask)
72  lon = lon[mask]
73  lat = lat[mask]
74  sss = sss[mask]
75  sss_err = sss_err[mask]
76  sss_qc = sss_qc[mask]
77 
78  for i in range(len(lon)):
79  if sss_qc[i] <= 150:
80  sss_qc[i] = 0
81  else:
82  sss_qc[i] = 1
83  # get date from filename
84  n = f.find("SM_")
85  date1 = f[n+19:n+19+8]
86  HH1 = f[n+19+9:n+19+11]
87  MM1 = f[n+19+11:n+19+13]
88  SS1 = f[n+19+13:n+19+15]
89  #
90  seconds = (datetime.strptime(date1+HH1+MM1+SS1, '%Y%m%d%H%M%S') - datetime.strptime(
91  date1, '%Y%m%d')).total_seconds()
92  basetime = datetime.strptime(date1, '%Y%m%d')
93  obs_date = basetime + timedelta(seconds=int(seconds))
94  locKey = lat[i], lon[i], obs_date.strftime("%Y-%m-%dT%H:%M:%SZ")
95  self.datadata[0][locKey][valKey] = sss[i]
96  self.datadata[0][locKey][errKey] = sss_err[i]
97  self.datadata[0][locKey][qcKey] = sss_qc[i]
98  ncd.close()
99 
100 
101 def main():
102 
103  parser = argparse.ArgumentParser(
104  description=(
105  'Read JPL/RSS SMOS sea surface salinity (SSS) file(s) and convert'
106  ' to a concatenated IODA formatted output file.')
107  )
108  required = parser.add_argument_group(title='required arguments')
109  required.add_argument(
110  '-i', '--input',
111  help="name of sss input file(s)",
112  type=str, nargs='+', required=True)
113  required.add_argument(
114  '-o', '--output',
115  help="name of ioda output file",
116  type=str, required=True)
117  required.add_argument(
118  '-d', '--date',
119  help="base date for the center of the window",
120  metavar="YYYYMMDDHH", type=str, required=True)
121  args = parser.parse_args()
122  fdate = datetime.strptime(args.date, '%Y%m%d%H')
123 #
124  writer = iconv.NcWriter(args.output, locationKeyList)
125 #
126 # # Read in the salinity
127  sal = Salinity(args.input, fdate, writer)
128 #
129 # # write them out
130  AttrData['date_time_string'] = fdate.strftime("%Y-%m-%dT%H:%M:%SZ")
131 #
132  (ObsVars, LocMdata, VarMdata) = writer.ExtractObsData(sal.data)
133  writer.BuildNetcdf(ObsVars, LocMdata, VarMdata, AttrData)
134 
135 
136 if __name__ == '__main__':
137  main()
def __init__(self, filenames, date, writer)