IODA Bundle
proc_gsi_ncdiag.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 import argparse
3 import os
4 import sys
5 import glob
6 import time
7 from multiprocessing import Pool
8 from pathlib import Path
9 
10 IODA_CONV_PATH = Path(__file__).parent/"@SCRIPT_LIB_PATH@"
11 if not IODA_CONV_PATH.is_dir():
12  IODA_CONV_PATH = Path(__file__).parent/'..'/'lib-python'
13 sys.path.append(str(IODA_CONV_PATH.resolve()))
14 
15 import gsi_ncdiag as gsid
16 
17 
18 def run_conv_obs(convfile, outdir, platforms):
19  print("Processing:"+str(convfile))
20  startt = time.time()
21  Diag = gsid.Conv(convfile)
22  Diag.read()
23  Diag.toIODAobs(outdir, platforms=platforms)
24  Diag.close()
25  print("Time (OBS) %s[%s]: %.3g sec" % (covfile, ",".join(platforms), time.time() - startt))
26  return 0
27 
28 
29 def run_radiances_obs(radfile, outdir, obsbias, qcvars, testrefs):
30  print("Processing run_radiances_obs:%s" % radfile)
31  startt = time.time()
32  Diag = gsid.Radiances(radfile)
33  Diag.read()
34  Diag.toIODAobs(outdir, obsbias, qcvars, testrefs)
35  Diag.close()
36  print("Time (OBS) %s: %.3g sec" % (radfile, time.time() - startt))
37  return 0
38 
39 
40 def run_aod_obs(aodfile, outdir):
41  print("Processing:"+str(aodfile))
42  startt = time.time()
43  Diag = gsid.AOD(aodfile)
44  Diag.read()
45  Diag.toIODAobs(outdir)
46  print("Time (OBS) %s: %.3g sec" % (aodfile, time.time() - startt))
47  return 0
48 
49 
50 def run_oz_obs(ozfile, outdir):
51  print("Processing:"+str(ozfile))
52  startt = time.time()
53  Diag = gsid.Ozone(ozfile)
54  Diag.read()
55  Diag.toIODAobs(outdir)
56  print("Time (OBS) %s: %.3g sec" % (ozfile, time.time() - startt))
57  return 0
58 
59 
60 def run_conv_geo(convfile, outdir):
61  print("Processing:"+str(convfile))
62  startt = time.time()
63  Diag = gsid.Conv(convfile)
64  Diag.read()
65  Diag.toGeovals(outdir)
66  print("Time (GEO) %s: %.3g sec" % (convfile, time.time() - startt))
67  return 0
68 
69 
70 def run_radiances_geo(radfile, outdir):
71  print("Processing run_radiances_geo:%s" % radfile)
72  startt = time.time()
73  Diag = gsid.Radiances(radfile)
74  Diag.read()
75  Diag.toGeovals(outdir)
76  print("Time (GEO) %s: %.3g sec" % (radfile, time.time() - startt))
77  return 0
78 
79 
80 def run_aod_geo(aodfile, outdir):
81  print("Processing:"+str(aodfile))
82  startt = time.time()
83  Diag = gsid.AOD(aodfile)
84  Diag.read()
85  Diag.toGeovals(outdir)
86  print("Time (GEO) %s: %.3g sec" % (aodfile, time.time() - startt))
87  return 0
88 
89 
90 def run_oz_geo(ozfile, outdir):
91  print("Processing:"+str(ozfile))
92  startt = time.time()
93  Diag = gsid.Ozone(ozfile)
94  Diag.read()
95  Diag.toGeovals(outdir)
96  print("Time (GEO) %s: %.3g sec" % (ozfile, time.time() - startt))
97  return 0
98 
99 
100 def run_radiances_obsdiag(radfile, outdir):
101  print("Processing run_radiances_obsdiag: %s" % radfile)
102  startt = time.time()
103  Diag = gsid.Radiances(radfile)
104  Diag.read()
105  Diag.toObsdiag(outdir)
106  print("Time (DIAG) %s: %.3g sec" % (radfile, time.time() - startt))
107  return 0
108 
109 
110 ScriptName = os.path.basename(sys.argv[0])
111 
112 # Parse command line
113 ap = argparse.ArgumentParser()
114 ap.add_argument("-n", "--nprocs",
115  help="Number of tasks/processors for multiprocessing")
116 ap.add_argument("input_dir", help="Path to concatenated GSI diag files")
117 ap.add_argument("-o", "--obs_dir",
118  help="Path to directory to output observations")
119 ap.add_argument("-g", "--geovals_dir",
120  help="Path to directory to output observations")
121 ap.add_argument("-d", "--obsdiag_dir",
122  help="Path to directory to output observations")
123 ap.add_argument("-b", "--add_obsbias", default=False,
124  help="Add ObsBias group to output observations")
125 ap.add_argument("-q", "--add_qcvars", default=False,
126  help="Add QC variables to output observations")
127 ap.add_argument("-r", "--add_testrefs", default=False,
128  help="Add TestReference group to output observations")
129 
130 MyArgs = ap.parse_args()
131 
132 if MyArgs.nprocs:
133  nprocs = int(MyArgs.nprocs)
134 else:
135  nprocs = 1
136 
137 DiagDir = MyArgs.input_dir
138 
139 print("Proc GSI Using %d processors." % nprocs)
140 obspool = Pool(processes=nprocs)
141 # process obs files
142 if MyArgs.obs_dir:
143  ObsDir = MyArgs.obs_dir
144  if not Path(ObsDir).is_dir():
145  raise Exception("Obs dir: '%s' does not exist." % ObsDir)
146  ObsBias = MyArgs.add_obsbias
147  QCVars = MyArgs.add_qcvars
148  TestRefs = MyArgs.add_testrefs
149  # conventional obs first
150  # get list of conv diag files
151  convfiles = glob.glob(DiagDir+'/*conv*')
152  for convfile in convfiles:
153  splitfname = convfile.split('/')[-1].split('_')
154  if 'conv' in splitfname:
155  i = splitfname.index('conv')
156  c = "_".join(splitfname[i:i + 2])
157  try:
158  for p in gsid.conv_platforms[c]:
159  res = obspool.apply_async(run_conv_obs, args=(convfile, ObsDir, [p]))
160  except KeyError:
161  pass
162  # radiances next
163  radfiles = glob.glob(DiagDir+'/diag*')
164  for radfile in radfiles:
165  process = False
166  for p in gsid.rad_sensors:
167  if p in radfile:
168  process = True
169  if process:
170  res = obspool.apply_async(run_radiances_obs, args=(radfile, ObsDir, ObsBias, QCVars, TestRefs))
171  # atmospheric composition observations
172  # aod first
173  for radfile in radfiles:
174  process = False
175  for p in gsid.aod_sensors:
176  if p in radfile:
177  process = True
178  if process:
179  res = obspool.apply_async(run_aod_obs, args=(radfile, ObsDir))
180  # ozone
181  for radfile in radfiles:
182  process = False
183  for p in gsid.oz_sensors:
184  if p in radfile:
185  process = True
186  if process:
187  res = obspool.apply_async(run_oz_obs, args=(radfile, ObsDir))
188 
189 # process geovals files
190 if MyArgs.geovals_dir:
191  GeoDir = MyArgs.geovals_dir
192  # conventional obs first
193  # get list of conv diag files
194  convfiles = glob.glob(DiagDir+'/*conv*')
195  for convfile in convfiles:
196  res = obspool.apply_async(run_conv_geo, args=(convfile, GeoDir))
197  # radiances next
198  radfiles = glob.glob(DiagDir+'/diag*')
199  for radfile in radfiles:
200  process = False
201  for p in gsid.rad_sensors:
202  if p in radfile:
203  process = True
204  if process:
205  res = obspool.apply_async(run_radiances_geo, args=(radfile, GeoDir))
206  # atmospheric composition observations
207  # aod first
208  for radfile in radfiles:
209  process = False
210  for p in gsid.aod_sensors:
211  if p in radfile:
212  process = True
213  if process:
214  res = obspool.apply_async(run_aod_geo, args=(radfile, GeoDir))
215  # ozone
216  for radfile in radfiles:
217  process = False
218  for p in gsid.oz_sensors:
219  if p in radfile:
220  process = True
221  if process:
222  res = obspool.apply_async(run_oz_geo, args=(radfile, GeoDir))
223 
224 # process obsdiag files
225 if MyArgs.obsdiag_dir:
226  ObsdiagDir = MyArgs.obsdiag_dir
227  # radiances only
228  radfiles = glob.glob(DiagDir+'/diag*')
229  for radfile in radfiles:
230  process = False
231  for p in gsid.rad_sensors:
232  if p in radfile:
233  process = True
234  if process:
235  res = obspool.apply_async(run_radiances_obsdiag, args=(radfile, ObsdiagDir))
236 
237 # process all in the same time, because sats with many channels are so slow...
238 obspool.close()
239 obspool.join()
def run_conv_obs(convfile, outdir, platforms)
def run_radiances_geo(radfile, outdir)
def run_radiances_obs(radfile, outdir, obsbias, qcvars, testrefs)
def run_aod_geo(aodfile, outdir)
def run_oz_obs(ozfile, outdir)
def run_radiances_obsdiag(radfile, outdir)
def run_aod_obs(aodfile, outdir)
def run_oz_geo(ozfile, outdir)
def run_conv_geo(convfile, outdir)